AWK - 如果 Test2 中的列在 Test1 的行中找到,则在 Test1 中插入 1 else 0

mnr*_*mnr 2 awk

我有两个文件 Test1 和 Test2。

测试1:

10AP23Q   ERTY
10AP20J   FDGC
978J15K   BGTD
98KT23M   ERTY
76VU14P   FDGC
Run Code Online (Sandbox Code Playgroud)

测试2:

23
19
15
Run Code Online (Sandbox Code Playgroud)

Test1 是一个固定宽度的文件。如果 Test2 中的列在 Test1 中的行中找到,则插入 '1' ,否则在 Test1 中的位置 9 处插入 '0'。

预期输出:

10AP23Q 1 ERTY
10AP20J 0 FDGC
978J15K 1 BGTD
98KT23M 1 ERTY
76VU14P 0 FDGC
Run Code Online (Sandbox Code Playgroud)

我试过下面的代码。在“}”附近出现解析错误。

awk 'BEGIN {if('NR==FNR {a[$1];next} (substr($0,5,2) in a)' test2 test1) (substr($0,9,1)="1") else(substr($0,9,1)="0")}'
Run Code Online (Sandbox Code Playgroud)

欣赏解决方案。

Sun*_*eep 6

这是一种方法:

$ awk 'BEGIN{FS=OFS=""} NR==FNR{a[$0]; next}
       {$9 = ($5$6 in a) ? 1 : 0} 1' Test2 Test1
10AP23Q 1 ERTY
10AP20J 0 FDGC
978J15K 1 BGTD
98KT23M 1 ERTY
76VU14P 0 FDGC
Run Code Online (Sandbox Code Playgroud)
  • FS=OFS=""清晰FSOFS以便每个字段都是单独的字符,与使用相比,更容易编写解决方案substr
  • NR==FNR{a[$0]; next} 根据整个行内容创建数组键 Test2
  • $9 = ($5$6 in a) ? 1 : 0检查第 5/6 个字符序列Test1是否作为数组中的键存在,并相应地更改第 9 个字符
    • 相反,三元运算符,你也可以使用$9 = ($5$6 in a),因为in回报1真实案例和0错误的情况下(礼节:anubhava
  • 1 打印内容的惯用方式 $0