我有两个文件 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)
欣赏解决方案。
这是一种方法:
$ 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=""清晰FS,OFS以便每个字段都是单独的字符,与使用相比,更容易编写解决方案substrNR==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