根据数组比较的结果在awk中编写一个新变量
Code a new variable in awk based on result of array comparison
我正在比较两个文件 file1 和 file2 中第 3 列中的值。当列的值在文件 1 和文件 2 中不匹配时,将其编码为 0。当列的值在文件 1 和文件 2 中不匹配时,将其编码为 1。例如:
文件 1
fid1 iid1 693 900 399
fid2 iid2 589 209 485
file2
fid0 iid0 693 448 932
fid8 iid8 482 548 589
期望输出
fid1 iid1 693 900 399 1
fid2 iid2 589 209 485 0
我可以在 awk 中得到这个输出,使用 awk 'FNR==NR{a[]++;next}a[]' file1 file2
输出
fid1 iid1 693 900 399
但是,我无法弄清楚如何根据 a[]
数组比较来编写新变量的代码,而不是仅打印 file1 中匹配的行。
你可以这样做:
$ awk 'NR==FNR{a[]++;next}{$(NF+1)=(( in a) ? 1 : 0)}1' file2 file1
fid1 iid1 693 900 399 1
fid2 iid2 589 209 485 0
注:
- 使用 $(NF+1) 可能不适用于旧的损坏的 awk。
- 这不做线比对。这只是检查 file1 的第三列是否存在于 file2 中。
我正在比较两个文件 file1 和 file2 中第 3 列中的值。当列的值在文件 1 和文件 2 中不匹配时,将其编码为 0。当列的值在文件 1 和文件 2 中不匹配时,将其编码为 1。例如:
文件 1
fid1 iid1 693 900 399
fid2 iid2 589 209 485
file2
fid0 iid0 693 448 932
fid8 iid8 482 548 589
期望输出
fid1 iid1 693 900 399 1
fid2 iid2 589 209 485 0
我可以在 awk 中得到这个输出,使用 awk 'FNR==NR{a[]++;next}a[]' file1 file2
输出
fid1 iid1 693 900 399
但是,我无法弄清楚如何根据 a[]
数组比较来编写新变量的代码,而不是仅打印 file1 中匹配的行。
你可以这样做:
$ awk 'NR==FNR{a[]++;next}{$(NF+1)=(( in a) ? 1 : 0)}1' file2 file1
fid1 iid1 693 900 399 1
fid2 iid2 589 209 485 0
注:
- 使用 $(NF+1) 可能不适用于旧的损坏的 awk。
- 这不做线比对。这只是检查 file1 的第三列是否存在于 file2 中。