我想使用awk从两个不同的文件中加入两列。这些文件看起来像(A,B,C,0,1,2等是列)
文件1:
A B C D E F
FIL2:
0 1 2 3 4 5
我希望能够在我的输出上选择任意列,其形式如下:
也就是说,我希望输出为:
A C E 4 5
我用以下awk代码(和非常相似的代码)看到了一百万个答案,没有提供任何解释。但它们都没有解决我想要解决的确切问题:
awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
awk '
NR==FNR {A[$1,$3,$6] = $0; next}
($1 SUBSEP $2 SUBSEP $3) in A {print A[$1,$2,$3], $4}
' A.txt B.txt
但他们似乎没有做我想做的事情,我无法理解他们。
那么,如何使用awk实现所需的输出? (请提供解释,我想实际学习)
注意: 我知道我可以使用像
这样的东西来做到这一点paste <(awk '{print $1}' file1) <(awk '{print $2}' file2)
正如我所说,我正在努力学习和理解awk。
答案 0 :(得分:1)
使用GNU awk实现真正的多维数组和ARGIND:
$ awk -v flds='1 1 1 3 1 5 2 5 2 6' '
BEGIN{ nf = split(flds,o) }
{ f[ARGIND][1]; split($0,f[ARGIND]) }
NR!=FNR { for (i=2; i<=nf; i+=2) printf "%s%s", f[o[i-1]][o[i]], (i<nf?OFS:ORS) }
' file1 file2
A C E 4 5
“flds”字符串只是一系列<file number> <field number in that file>
对,因此您可以按照您喜欢的顺序打印每个文件中的字段,例如:
$ awk -v flds='1 1 2 2 1 3 2 4 1 5 2 6' 'BEGIN{nf=split(flds,o)} {f[ARGIND][1]; split($0,f[ARGIND])} NR!=FNR{for (i=2; i<=nf; i+=2) printf "%s%s",f[o[i-1]][o[i]], (i<nf?OFS:ORS)}' file1 file2
A 1 C 3 E 5
$ awk -v flds='2 1 1 2 2 3 1 4 2 5' 'BEGIN{nf=split(flds,o)} {f[ARGIND][1]; split($0,f[ARGIND])} NR!=FNR{for (i=2; i<=nf; i+=2) printf "%s%s",f[o[i-1]][o[i]], (i<nf?OFS:ORS)}' file1 file2
0 B 2 D 4