比较2个文件中的两列,并使用awk替换另一列

时间:2015-12-24 09:14:23

标签: linux unix awk

$ cat input2 

0105|195267|99/99/9999|

0115|195719|77/77/7777|

0125|195505|88/88/8888|

0135|195719|00/00/0007|


$ cat input1

0105|195267|0|Header|StefenStarts|DIY|06/28/1984|6000|$1656.0000|$1656.0000|$0.0000|
0125|195505|0|Header|StellarCollar|DIY|01/01/1900|6000|$284.0000|$284.0000|$0.0000|
0115|195719|0|Header|DamoranKinsley|DIY|05/14/1980|6000|$5328.2500|$5328.2500|$0.0000|

预期产出:

0105|195267|0|Header|StefenStarts|DIY|99/99/9999|6000|$1656.0000|$1656.0000|$0.0000|
0125|195505|0|Header|StellarCollar|DIY|88/88/8888|6000|$284.0000|$284.0000|$0.0000|
0115|195719|0|Header|DamoranKinsley|DIY|77/77/7777|6000|$5328.2500|$5328.2500|$0.0000|

当input1的第一列和第二列与input2的第一列和第二列匹配时,input1文件的第7列将替换为input2的第3列中的日期。

这个awk命令有效,但只检查第二列。我需要检查第一列和第二列的组合。任何人都可以帮忙解决这个问题。

尝试:

awk 'NR==FNR{A[$2]=$3; next} $3==0 && $4=="Header" && $2 in A{$7=A[$2]}1' FS="|" OFS="|" input2 input1

这为第3行提供了错误的输出,因为它仅检查第二列。它实际上应该检查第一列和第二列的组合。

0105|195267|0|Header|StefenStarts|DIY|99/99/9999|6000|$1656.0000|$1656.0000|$0.0000|
0125|195505|0|Header|StellarCollar|DIY|88/88/8888|6000|$284.0000|$284.0000|$0.0000|
0115|195719|0|Header|DamoranKinsley|DIY|00/00/0007|6000|$5328.2500|$5328.2500|$0.0000|

任何输入请...... ??

2 个答案:

答案 0 :(得分:1)

尝试下面。我希望它有所帮助。

awk 'NR==FNR{A[$1,$2]=$3; next} $3==0 && $4=="Header" && ($1,$2) in A{$7=A[$1,$2]}1' FS="|" OFS="|" input2 input1

答案 1 :(得分:1)

  • 使用选项-v在命令行或BEGIN部分
  • 中设置变量
  • 您指定第一个和第二个字段,但仅在A[$2]的第二个字段的数组中存储值

这里有更正:

awk 'BEGIN{OFS=FS="|"}FNR==NR{I[$1"|"$2]=$3;next}$1"|"$2 in I && $3==0 && $4=="Header"{$7=I[$1"|"$2]}1' input2 input1