簡體   English   中英

用於合並3個文件的Shell腳本

[英]Shell Script for combining 3 files

我有以下數據的3個文件

$cat File1.txt
Apple,May
Orange,June
Mango,July

$cat File2.txt
Apple,Jan
Grapes,June

$cat File3.txt
Apple,March
Mango,Feb
Banana,Dec

我需要以下輸出文件。

$Output_file.txt
Apple,May|Jan|March
Orange,June
Mango,July|Feb
Grapes,June
Banana,Dec

這里的要求是取出第一列,然后需要搜索每個文件中第一列的公共數據,第二列需要為“ |”。 分開。 如果沒有公共列,則需要在輸出文件中打印相同的列。

我嘗試將其放入while循環中,但是隨着文件大小的增加,這會花費一些時間。 想要使用shell腳本的簡單解決方案。

這應該工作:

#!/bin/bash
for FRUIT in $( cat "$@" | cut -d "," -f 1 | sort | uniq )
do
    echo -ne "${FRUIT},"
    awk -F "," "\$1 == \"$FRUIT\" {printf(\"%s|\",\$2)}" "$@" | sed 's/.$/\'$'\n/'
done

運行為:

$ ./script.sh File1.txt File2.txt File3.txt

一個純本機bash解決方案(無需調用任何外部工具,因此僅受bash本身的性能限制)可能類似於:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4 or newer required" >&2; exit 1;; esac

declare -A items=( )
for file in "$@"; do
  while IFS=, read -r key value; do
    items[$key]+="|$value"
  done <"$file"
done

for key in "${!items[@]}"; do
  value=${items[$key]}
  printf '%s,%s\n' "$key" "${value#'|'}"
done

...稱為./yourscript File1.txt File2.txt File3.txt

使用單個awk命令即可輕松完成此操作:

awk 'BEGIN{FS=OFS=","} {a[$1] = a[$1] (a[$1] == "" ? "" : "|") $2}
END {for (i in a) print i, a[i]}' File{1,2,3}.txt

Orange,June
Banana,Dec
Apple,May|Jan|March
Grapes,June
Mango,July|Feb

如果要以與原始文件中出現的字符串相同的順序輸出,請使用以下awk

awk 'BEGIN{FS=OFS=","} !($1 in a) {b[++n] = $1}
{a[$1] = a[$1] (a[$1] == "" ? "" : "|") $2}
END {for (i=1; i<=n; i++) print b[i], a[b[i]]}' File{1,2,3}.txt

Apple,May|Jan|March
Orange,June
Mango,July|Feb
Grapes,June
Banana,Dec

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM