Linux 如何使用awk比较和替换字段

Linux 如何使用awk比较和替换字段,linux,awk,Linux,Awk,我有两个文件。如果文件1的字段9和文件2的字段1相同,则将文件1的字段1替换为文件1的字段2 文件1: 12345||||||756432101000||756432|||| aaaaa||||||986754812345||986754|||| ccccc||||||134567222222||134567|||| 文件2: 756432|AAAAAAAAAAA 986754|20030040000 预期产出为: 12345||||||AAAAAAAAAAA||756432||||

我有两个文件。如果文件1的字段9和文件2的字段1相同,则将文件1的字段1替换为文件1的字段2

文件1:

12345||||||756432101000||756432||||
aaaaa||||||986754812345||986754||||
ccccc||||||134567222222||134567||||
文件2:

756432|AAAAAAAAAAA  
986754|20030040000  
预期产出为:

12345||||||AAAAAAAAAAA||756432||||
aaaaa||||||20030040000||986754||||
ccccc||||||134567222222||134567|||
我试过这个密码

awk -F"|" 'NR==FNR{a[$1]=$2} NR>FNR{$7=a[$2];print}' OFS='|'  file2 file1

但不是替换字段,而是将其删除

您在第二个块中使用了错误的列作为数组的索引,并且没有检查是否缺少键。这将生成您发布的输出:

awk -F '|' -v OFS='|' 'NR==FNR{a[$1]=$2;next}$9 in a{$7=a[$9]}1' file2 file1

您使用了错误的列作为第二个块中数组的索引,并且没有检查是否缺少键。这将生成您发布的输出:

awk -F '|' -v OFS='|' 'NR==FNR{a[$1]=$2;next}$9 in a{$7=a[$9]}1' file2 file1

谢谢你的建议,请你解释一下[9美元]=“@SGS:当然,加上
a[$9]=“
我们测试数组
a
是否包含字段
$9
中表示的字符串值,因此我们仅在文件2中找到相应值时更改
$7
的值。而不是
a[$9]=“”您可能会在< <代码>中考虑<代码> 9美元。对于前者,awk实际上会添加一个数组元素,其中包含
$9
作为索引和空值。后者只是检查它是否在那里,而不使用任何额外的内存。通常这两种方法都可以,但当涉及到大型文件时,最好记住它们之间的差异。如果有两个变量必须具有相同的值,则将它们一起初始化为该值一次,而不是在两个单独的位置将它们初始化为相同的值,以消除冗余并提高清晰度。因此,在本例中,请使用
awk'BEGIN{FS=OFS=“|”}…
而不是
awk-F'|'-v-OFS='|'''''''.
谢谢您的建议,请您解释一下[$9]=“@SGS:当然,加上
a[$9]=“
我们测试数组
a
是否包含字段
$9
中表示的字符串值,因此我们仅在文件2中找到相应值时更改
$7
的值。而不是
a[$9]=“”您可能会在< <代码>中考虑<代码> 9美元。对于前者,awk实际上会添加一个数组元素,其中包含
$9
作为索引和空值。后者只是检查它是否在那里,而不使用任何额外的内存。通常这两种方法都可以,但当涉及到大型文件时,最好记住它们之间的差异。如果有两个变量必须具有相同的值,则将它们一起初始化为该值一次,而不是在两个单独的位置将它们初始化为相同的值,以消除冗余并提高清晰度。因此,在这种情况下,使用
awk'BEGIN{FS=OFS=“|”}…
而不是
awk-F'|'-v-OFS='|'''''.