使用awk从不同文件加入两列

时间:2017-02-06 11:51:17

标签: awk

我想使用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。

1 个答案:

答案 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