加入gawk中的多个文件

时间:2014-04-19 18:26:59

标签: awk gawk

我有大量文件(大约500个)。每个文件包含两列。每个文件的第一列相同。我想使用gawk将所有文件合并到一个文件中 例如,

File 1  
a 123  
b 221  
c 904 

File 2 
a 298  
b 230  
c 102  

等等。我想要一个如下所示的最终文件:

Final file
a 123 298  
b 221 230  
c 904 102  

我找到了可以加入两个文件的脚本,但我需要加入多个文件。

4 个答案:

答案 0 :(得分:5)

对于给定的示例文件:

$ head f*
==> f1 <==
a 123
b 221
c 904

==> f2 <==
a 298
b 230
c 102

==> f3 <==
a 500
b 600
c 700

方法1:

$ 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个文件,可能会更快)

一起使用pasteawk。 (假设第一列相同并存在于所有文件中)。执行paste f*会得到以下结果:

$ paste f*
a 123   a 298   a 500
b 221   b 230   b 600
c 904   c 102   c 700

将其传递到awk以删除多余的列。

$ 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

您可以将输出重定向到另一个文件。

答案 1 :(得分:1)

我经常遇到这个问题。

我强烈建议您查看gawk中的getline函数。

getline var < filename

是命令语法,可用于解决您的问题。

我建议使用另一种语言来更轻松地解决这个问题。通常我会投入大约5行代码来解决这个标准问题。

j=1;
j=getline x < "filename";
if(j==0) {
      break;
}
... (Commands involving x such as split and print).

答案 2 :(得分:0)

您可以尝试以下方式:

$ 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

答案 3 :(得分:0)

awk 'FNR==NR{arr[$1]=$2; next;}{printf "%s%s%s%s%s",$1,OFS,arr[$1],OFS,$2; print"";}' file1 file2

基于this