Join multiple files in gawk
我有很多文件(大约500个)。每个文件包含两列。第一列对于每个文件都是相同的。我想使用gawk将所有文件连接到一个文件中。例如,
1 2 3 4  | File 1   a 123 b 221 c 904  | 
1 2 3 4  | File 2  a 298 b 230 c 102  | 
号
等等。我想要一个像下面这样的最终文件:
1 2 3 4  | Final file a 123 298 b 221 230 c 904 102  | 
我找到了可以连接两个文件的脚本,但我需要连接多个文件。
对于给定的示例文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | $ head f* ==> f1 <== a 123 b 221 c 904 ==> f2 <== a 298 b 230 c 102 ==> f3 <== a 500 b 600 c 700  | 
号方法1:
1 2 3 4  | $ awk '{a[FNR]=((a[FNR])?a[FNR]FS$2:$0)}END{for(i=1;i<=FNR;i++) print a[i]}' f* a 123 298 500 b 221 230 600 c 904 102 700  | 
方法2:(可能会更快,因为您没有在内存中加载500个文件)
同时使用
1 2 3 4  | $ paste f* a 123 a 298 a 500 b 221 b 230 b 600 c 904 c 102 c 700  | 
。
通过管道将其输送至
1 2 3 4  | $ paste f* | awk '{printf"%s",$1;for(i=2;i<=NF;i+=2) printf"%s%s",$i,(i==NF?RS:FS)}' a 123 298 500 b 221 230 600 c 904 102 700  | 
您可以将输出重新定向到另一个文件。
我经常遇到这个问题。
我强烈建议您检查gawk中的
1  | getline var < filename  | 
。
是命令语法,可以用来解决问题。
我建议使用另一种更容易解决这个问题的语言。通常我会投资5行代码来解决这个标准问题。
1 2 3 4 5 6  | j=1; j=getline x <"filename"; if(j==0) { break; } ... (Commands involving x such as split and print).  | 
1  | awk 'FNR==NR{arr[$1]=$2; next;}{printf"%s%s%s%s%s",$1,OFS,arr[$1],OFS,$2; print"";}' file1 file2  | 
。
基于此
您可以尝试如下操作:
1 2 3 4 5 6  | $ ls f1.txt f2.txt f3.txt $ awk '($0 !~ /#/){a[$1]=a[$1]""$2} END {for(i in a){print i""a[i]}}' *.txt a 123 298 299 b 221 230 231 c 904 102 103  |