匹配一列文件与另一个文件,并使用bash替换不同的列

时间:2018-02-04 02:31:59

标签: linux bash awk sed

我有点像这样的菜鸟,如果我不够清楚,请原谅我的无知。我有两个文件。 File1如下所示。

file1

AA--:Aa-to-Bb:VGG sometext 1223344 10000 sometext
AB--:Aa-to-Bb:VGG sometext 1223344 12000 sometext
CC--:Dd-to-Ee:VGG sometext 1223344 44000 sometext
AA--:Zz-to-Yy:VGG sometext 1223344 51000 sometext
DD--:Aa-to-Dd:VGG sometext 1223344 36000 sometext

File2看起来很相似,但第1列和第4列有所不同。

file2

CC--:Dd-to-Ee:VGG6645 sometext 1223344 3000 sometext
AA--:Zz-to-Yy:VGG2244 sometext 1223344 1000 sometext
AA--:Aa-to-Bb:VGG12345 sometext 1223344 12200 sometext
AB--:Aa-to-Bb:VGG76523 sometext 1223344 33300 sometext
EE--:Dd-to-Ee:VGG45123 sometext 1223344 76500 sometext
DD--:Aa-to-Dd:VGG3486 sometext 1223344 400 sometext
AA--:Dd-to-Ee:VGG4512 sometext 1223344 22300 sometext
AA--:Zz-to-Dd:VGG98765 sometext 1223344 7000 sometext
CC--:Dd-to-Zz:VGG43576 sometext 1223344 900 sometext
FF--:Zz-to-Yy:VGG5645 sometext 1223344 91200 sometext
CC--:Zz-to-Ee:VGG23456 sometext 1223344 3400 sometext
AA--:Ff-to-Yy:VGG1111 sometext 1223344 51000 sometext

我正在尝试通过bash脚本进行一些自动处理。其中一项任务是比较两个文件。如果file1第1列中的条目与file2第1列中的条目匹配(包括“VGG”),则file1中第4列的值将替换file2中第4列中的值。

new file2

CC--:Dd-to-Ee:VGG6645 sometext 1223344 44000 sometext
AA--:Zz-to-Yy:VGG2244 sometext 1223344 51000 sometext
AA--:Aa-to-Bb:VGG12345 sometext 1223344 10000 sometext
AB--:Aa-to-Bb:VGG76523 sometext 1223344 12000 sometext
EE--:Dd-to-Ee:VGG45123 sometext 1223344 76500 sometext
DD--:Aa-to-Dd:VGG3486 sometext 1223344 36000 sometext
AA--:Dd-to-Ee:VGG4512 sometext 1223344 22300 sometext
AA--:Zz-to-Dd:VGG98765 sometext 1223344 7000 sometext
CC--:Dd-to-Zz:VGG43576 sometext 1223344 900 sometext
FF--:Zz-to-Yy:VGG5645 sometext 1223344 91200 sometext
CC--:Zz-to-Ee:VGG23456 sometext 1223344 3400 sometext
AA--:Ff-to-Yy:VGG1111 sometext 1223344 51000 sometext

我尝试过使用各种awk和sed命令,以及grep,sort和其他命令,我无法得到我想要的结果。任何帮助或建议,将不胜感激。

2 个答案:

答案 0 :(得分:1)

awk以下可能有帮助

$ awk 'NR==FNR{rec[$1]=$4;next}{temp=$1;sub(/VGG[0-9]+$/,"VGG",temp)} temp in rec{$4=rec[temp]}1' file1 file2

<强>输出

CC--:Dd-to-Ee:VGG6645 sometext 1223344 44000 sometext
AA--:Zz-to-Yy:VGG2244 sometext 1223344 51000 sometext
AA--:Aa-to-Bb:VGG12345 sometext 1223344 10000 sometext
AB--:Aa-to-Bb:VGG76523 sometext 1223344 12000 sometext
EE--:Dd-to-Ee:VGG45123 sometext 1223344 76500 sometext
DD--:Aa-to-Dd:VGG3486 sometext 1223344 36000 sometext
AA--:Dd-to-Ee:VGG4512 sometext 1223344 22300 sometext
AA--:Zz-to-Dd:VGG98765 sometext 1223344 7000 sometext
CC--:Dd-to-Zz:VGG43576 sometext 1223344 900 sometext
FF--:Zz-to-Yy:VGG5645 sometext 1223344 91200 sometext
CC--:Zz-to-Ee:VGG23456 sometext 1223344 3400 sometext
AA--:Ff-to-Yy:VGG1111 sometext 1223344 51000 sometext

如果您需要重写file2

$ awk 'NR==FNR{rec[$1]=$4;next}
      {temp=$1;sub(/VGG[0-9]+$/,"VGG",temp)}
      temp in rec{$4=rec[temp]}1' file1 file2 >filetmp && mv filetmp file2

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r 's|^(\S+)(\s(\S+)){3}\s.*|/^\1/s/\\S+/\3/4|' file2 | sed -rf - -i file1

这将从file2生成一个sed脚本,然后针对file1运行它。

从file2生成的sed脚本使用第一列值匹配目标文件中的一行,然后使用第四列中的值替换目标文件中的第四列。