以比较的方式合并多个文本文件

时间:2017-05-08 16:46:12

标签: bash awk grep

第一次发帖,所以请耐心等待我... 我有一个名称列表和几个不同的文件(~600),可能包含也可能不包含列表中的所有名称和分配给名称的值。我需要将每个文件中的所有这些值与列表中的名称进行比较。这些是我有的txt文件类型

列表

Alligator mississippiensis
Anas platyrhynchos
Anolis carolinensis
Chrysemys picta
Columba livia
Gallus gallus

File1中

Alligator mississippiensis 2546
Anas platyrhynchos 32
Columba livia 21571
Gallus gallus 226

文件2

Anas platyrhynchos 2
Anolis carolinensis 3255
Chrysemys picta 225
Columba livia 2215
Gallus gallus 22548

这是我正在寻找的输出,其中标题将是文件的名称。

List File1,File2
Alligator mississippiensis 2546,0
Anas platyrhynchos 32,2
Anolis carolinensis 0,3255
Chrysemys picta 0,225
Columba livia 21571, 2215
Gallus gallus 226, 22548

我认为类似grep字符串上的字符串,如果找到,从File *打印第2列,然后连续追加,如果没有在列表中找到字符串,则打印0。

2 个答案:

答案 0 :(得分:2)

awk '
BEGIN { OFS="," }
{ list[$1 FS $2][ARGIND] = $3 }
END {
    printf "%s%s", ARGV[1], FS
    for (fileNr=2; fileNr<=ARGIND; fileNr++) {
        printf "%s%s", ARGV[fileNr], (fileNr<ARGIND ? OFS : ORS)
    }
    for (item in list) {
        printf "%s%s", item, FS
        for (fileNr=2; fileNr<=ARGIND; fileNr++) {
            printf "%d%s", list[item][fileNr], (fileNr<ARGIND ? OFS : ORS)
        }
    }
}
' List File*
List File1,File2
Columba livia 21571,2215
Chrysemys picta 0,225
Anolis carolinensis 0,3255
Gallus gallus 226,22548
Anas platyrhynchos 32,2
Alligator mississippiensis 2546,0

上面使用GNU awk表示ARGIND和真正的多维数组。

由于in运算符,项目的打印顺序是随机的,如果这是一个问题,可以轻松更改。

答案 1 :(得分:1)

另一个awk

$ awk         '{k=$1 FS $2} 
     NR==FNR   {list[k]; next} 
     FNR==1    {f++} 
     k in list {a[k,f]=$3} 
     END       {for(k in list) 
                  {printf "%s ",k; 
                   for(i=1;i<=f;i++) printf "%s%s",a[k,i]+0,(i==f?ORS:",")}}' list file* |
  sort

Alligator mississippiensis 2546,0
Anas platyrhynchos 32,2
Anolis carolinensis 0,3255
Chrysemys picta 0,225
Columba livia 21571,2215
Gallus gallus 226,22548