AWK-使用多个文件查找和替换多个字段

AWK-使用多个文件查找和替换多个字段,awk,Awk,在AWK中我很难找到我需要达到的目标。我有两个文件: 文件1 文件2 我需要将文件1中的字段10和11替换为文件2中的字段3和4,其中文件1中的字段10和11等于文件2中的字段1和2 因此,我对本例的期望输出为: 1|2|3|4|5|6|7|8|9|AA1|BB1|12|13| 1|2|3|4|5|6|7|8|9|CC1|DD1|12|13| 1|2|3|4|5|6|7|8|9|EE1|FF1|12|13| 1|2|3|4|5|6|7|8|9|GG1|HH1|12|13| 1|2|3|4|5|6

在AWK中我很难找到我需要达到的目标。我有两个文件:

文件1

文件2

我需要将文件1中的字段10和11替换为文件2中的字段3和4,其中文件1中的字段10和11等于文件2中的字段1和2

因此,我对本例的期望输出为:

1|2|3|4|5|6|7|8|9|AA1|BB1|12|13|
1|2|3|4|5|6|7|8|9|CC1|DD1|12|13|
1|2|3|4|5|6|7|8|9|EE1|FF1|12|13|
1|2|3|4|5|6|7|8|9|GG1|HH1|12|13|
1|2|3|4|5|6|7|8|9|II1|JJ1|12|13|
1|2|3|4|5|6|7|8|9|KK1|LL1|12|13|
1|2|3|4|5|6|7|8|9|MM1|NN1|12|13|
1|2|3|4|5|6|7|8|9|OO1|PP1|12|13|
1|2|3|4|5|6|7|8|9|QQ1|RR1|12|13|
1|2|3|4|5|6|7|8|9|SS1|TT1|12|13|
1|2|3|4|5|6|7|8|9|UUU|VVV|12|13|
1|2|3|4|5|6|7|8|9|WWW|XXX|12|13|
1|2|3|4|5|6|7|8|9|YYY|ZZZ|12|13|
1|2|3|4|5|6|7|8|9|QWE|RTY|12|13|
1|2|3|4|5|6|7|8|9|ASD|FGH|12|13|
1|2|3|4|5|6|7|8|9|ZXC|VBN|12|13|
1|2|3|4|5|6|7|8|9|ASS|BOB|12|13|
1|2|3|4|5|6|7|8|9|FFR|ERD|12|13|
非常感谢您的帮助。

这样行吗

awk 'BEGIN{FS=OFS="|"}
     FNR==NR {a[$1,$2]=$3; b[$1,$2]=$4; next}
    ($10,$11) in a {f10=a[$10,$11];$11=b[$10,$11];$10=f10}
    1' f2 f1
试验 解释
  • BEGIN{FS=OFS=“|”}
    将输入和输出字段分隔符设置为
    |
  • FNR==NR{a[$1,$2]=$3;b[$1,$2]=$4;next}
    读取给定的第一个文件(
    f2
    )时,在数组
    a[]
    中存储第三个字段,在数组
    b[]
    中存储第四个字段,索引由该对
    ($1,$2)
    给出
  • ($10,$11)在a{f10=a[$10,$11];$11=b[$10,$11];$10=f10}
    中循环遍历给定的第二个文件(
    f1
    ),检查该对
    ($10,$11)
    是否存储在数组
    a[]
    中。如果是,请进行更换。否则,线路将保持原样
  • 1
    根据真实情况,打印当前行

您的实际文件长度也是固定的吗?或者仅仅是因为想法和字段可能具有可变长度?嗨,不,真正的文件具有可变的字段长度。我想我能帮你。我现在不能写一个答案,类似于
awk'BEGIN{FS=OFS=“|”}FNR==NR{a[$1fs$2]=$3fs$4;next}($10fs$11)在a{$10=a[$10fs$11];$11=”“}1f2 f1
中也可以完成,通过
$1fs$2
索引存储所有内容。无论如何,这会导致额外的
|
1|2|3|4|5|6|7|8|9|AA1|BB1|12|13|
1|2|3|4|5|6|7|8|9|CC1|DD1|12|13|
1|2|3|4|5|6|7|8|9|EE1|FF1|12|13|
1|2|3|4|5|6|7|8|9|GG1|HH1|12|13|
1|2|3|4|5|6|7|8|9|II1|JJ1|12|13|
1|2|3|4|5|6|7|8|9|KK1|LL1|12|13|
1|2|3|4|5|6|7|8|9|MM1|NN1|12|13|
1|2|3|4|5|6|7|8|9|OO1|PP1|12|13|
1|2|3|4|5|6|7|8|9|QQ1|RR1|12|13|
1|2|3|4|5|6|7|8|9|SS1|TT1|12|13|
1|2|3|4|5|6|7|8|9|UUU|VVV|12|13|
1|2|3|4|5|6|7|8|9|WWW|XXX|12|13|
1|2|3|4|5|6|7|8|9|YYY|ZZZ|12|13|
1|2|3|4|5|6|7|8|9|QWE|RTY|12|13|
1|2|3|4|5|6|7|8|9|ASD|FGH|12|13|
1|2|3|4|5|6|7|8|9|ZXC|VBN|12|13|
1|2|3|4|5|6|7|8|9|ASS|BOB|12|13|
1|2|3|4|5|6|7|8|9|FFR|ERD|12|13|
awk 'BEGIN{FS=OFS="|"}
     FNR==NR {a[$1,$2]=$3; b[$1,$2]=$4; next}
    ($10,$11) in a {f10=a[$10,$11];$11=b[$10,$11];$10=f10}
    1' f2 f1
$ awk 'BEGIN{FS=OFS="|"} FNR==NR {a[$1,$2]=$3; b[$1,$2]=$4; next} ($10,$11) in a {f10=a[$10,$11];$11=b[$10,$11];$10=f10}1' f2 f1
1|2|3|4|5|6|7|8|9|AA1|BB1|12|13|
1|2|3|4|5|6|7|8|9|CC1|DD1|12|13|
1|2|3|4|5|6|7|8|9|EE1|FF1|12|13|
1|2|3|4|5|6|7|8|9|GG1|HH1|12|13|
1|2|3|4|5|6|7|8|9|II1|JJ1|12|13|
1|2|3|4|5|6|7|8|9|KK1|LL1|12|13|
1|2|3|4|5|6|7|8|9|MM1|NN1|12|13|
1|2|3|4|5|6|7|8|9|OO1|PP1|12|13|
1|2|3|4|5|6|7|8|9|QQ1|RR1|12|13|
1|2|3|4|5|6|7|8|9|SS1|TT1|12|13|
1|2|3|4|5|6|7|8|9|UUU|VVV|12|13|
1|2|3|4|5|6|7|8|9|WWW|XXX|12|13|
1|2|3|4|5|6|7|8|9|YYY|ZZZ|12|13|
1|2|3|4|5|6|7|8|9|QWE|RTY|12|13|
1|2|3|4|5|6|7|8|9|ASD|FGH|12|13|
1|2|3|4|5|6|7|8|9|ZXC|VBN|12|13|
1|2|3|4|5|6|7|8|9|ASS|BOB|12|13|
1|2|3|4|5|6|7|8|9|FFR|ERD|12|13|