在gawk中连接多个文件
我有大量的文件(大约500个)。每个文件包含两列。第一列对于每个文件都是相同的。我想使用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 !~ /
比如说,
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).