在gawk中连接多个文件

在gawk中连接多个文件,awk,gawk,Awk,Gawk,我有大量的文件(大约500个)。每个文件包含两列。第一列对于每个文件都是相同的。我想使用gawk将所有文件合并到一个文件中。 比如说, File 1 a 123 b 221 c 904 等等。我想要一个最终文件,如下所示: Final file a 123 298 b 221 230 c 904 102 我找到了可以连接两个文件的脚本,但我需要连接多个文件。您可以尝试以下方法: $ ls f1.txt f2.txt f3.txt $ awk '($0 !~ /

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

File 1  
a 123  
b 221  
c 904 
等等。我想要一个最终文件,如下所示:

Final file
a 123 298  
b 221 230  
c 904 102  

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

您可以尝试以下方法:

$ 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

对于给定的示例文件:

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

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

==> f3 <==
a 500
b 600
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
$paste f*| awk'{printf“%s”,$1;for(i=2;i

基于

我经常遇到这个问题

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

getline var < filename
getline var
是命令语法,可用于解决您的问题

我建议使用另一种更容易解决这个问题的语言。通常我会投资大约5行代码来解决这个标准问题

j=1;
j=getline x < "filename";
if(j==0) {
      break;
}
... (Commands involving x such as split and print).
j=1;
j=getline x<“文件名”;
如果(j==0){
打破
}
…(涉及x的命令,如拆分和打印)。

您也可以为(a中的i{print i,a[i]}*.txt执行
awk'{a[$1]=(a[$1])?a[$1]FS$2:$2}END{for(a中的i){print i,a[i]}'*.txt
但这不会保留文件的顺序。由于
中的
运算符(
for(a中的
),最终输出将是随机的。这只适用于2个文件。OP希望将大约500个文件连接在一起。对我来说效果非常好。很好,很高兴我能提供帮助。@userpmondal:请毫不犹豫地对您认为有用的答案进行投票;)@userpmondal别担心。你很快就会到的!
:)
@userpmondal-arf,我不知道对不起。你会如何准确地使用
getline
?目前来看,这不是一个非常完整的答案。请注意,其他答案都没有使用
getline
,因此你将添加一个具有更完整答案的新方法。
$ 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
awk 'FNR==NR{arr[$1]=$2; next;}{printf "%s%s%s%s%s",$1,OFS,arr[$1],OFS,$2; print"";}' file1 file2
getline var < filename
j=1;
j=getline x < "filename";
if(j==0) {
      break;
}
... (Commands involving x such as split and print).