AWK-如果Test2中的列在Test1的行中找到,则在Test1中插入1else0
我有两个文件 Test1 和 Test2。
测试1:
10AP23Q ERTY
10AP20J FDGC
978J15K BGTD
98KT23M ERTY
76VU14P FDGC
测试2:
23
19
15
Test1 是一个固定宽度的文件。如果 Test2 中的列在 Test1 中的行中找到,则插入 '1' ,否则在 Test1 中的位置 9 处插入 '0'。
预期输出:
10AP23Q 1 ERTY
10AP20J 0 FDGC
978J15K 1 BGTD
98KT23M 1 ERTY
76VU14P 0 FDGC
我试过下面的代码。在“}”附近出现解析错误。
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")}'
欣赏解决方案。
回答
这是一种方法:
$ 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
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
THE END
二维码