【问题标题】:Compare two columns in 2 files and replace another column using awk比较 2 个文件中的两列并使用 awk 替换另一列
【发布时间】:2015-12-24 18:07:51
【问题描述】:
$ 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

这会为第三行提供不正确的输出,因为它只检查第二列。它实际上应该检查第一列和第二列的组合。

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|

请输入任何内容..??

【问题讨论】:

    标签: linux unix awk


    【解决方案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
    

    【讨论】:

    • 非常感谢@Vidya.. 它的工作原理和预期的一样完美
    【解决方案2】:
    • 使用选项-v 在命令行或BEGIN 部分中设置变量
    • 您指定了 1st 和第二个字段,但只在数组中存储带有 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
    

    【讨论】:

    • 我会写 I[$1 FS $2]$1 FS $2 in I 这样你就不必一直重复管道。此外,在脚本和文件之间定义 awk 变量是有效的,但我也不喜欢这种风格。
    • 感谢@NeronLeVelu。
    猜你喜欢
    • 2021-11-17
    • 2013-09-06
    • 2015-02-22
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2023-03-27
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多