使用awk脚本有条件地替换char

时间:2013-02-22 10:42:55

标签: awk

我在file1下面

22392003|28|ABC
22392004|28|ABC
22392006|28|XYZ
22392002|28|XYZ

这是另一个文件2

MR30011596|user||IM1450029|22392099|28|AAA|28
MR30011596|user||IM1450029|22392099|28|BBB|28
MR30011596|user||IM1450029|22392006|28|CCC|28
MR30011596|user||IM1450029|22392099|28|DDD|28

我想在$ 5的位置搜索$ 1的file1到file2,如果匹配,则将$ 3的file1替换为$ 7的$ 所以这里应该是最终输出

MR30011596|user||IM1450029|22392099|28|AAA|28
MR30011596|user||IM1450029|22392099|28|BBB|28
*MR30011596|user||IM1450029|22392006|28|XYZ|28*
MR30011596|user||IM1450029|22392099|28|DDD|28

我尝试使用awk -F "|" 'FNR==NR { a[$1]; next } $5 in a'搜索字符,但不知道如何在$ 7位置将$ 3替换为file2 我们可以使用awk script

实现这一目标

2 个答案:

答案 0 :(得分:3)

 awk 'BEGIN{FS=OFS="|"}NR==FNR{a[$1]=$3;next}$5 in a{$7=a[$5]}1' file1 file2

上面的行给出了输出。 (没有*

答案 1 :(得分:0)

您还可以通过两次join的调用来完成此操作:

# The input needs to be sorted on the join fields
sort             file1 > file1.sorted
sort -t'|' -k5,5 file2 > file2.sorted

(
  join -t'|' -2 5     -o '2.1 2.2 2.3 2.4 2.5 2.6 1.3 2.8' file1.sorted file2.sorted
  join -t'|' -2 5 -v2 -o '2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8' file1.sorted file2.sorted
)

输出:

MR30011596|user||IM1450029|22392006|28|XYZ|28
MR30011596|user||IM1450029|22392099|28|AAA|28
MR30011596|user||IM1450029|22392099|28|BBB|28
MR30011596|user||IM1450029|22392099|28|DDD|28