同一文件中的列之间的AWK查找(类似于VLOOKUP) [英] AWK Lookup between columns in the same file(similar to vlookup)
本文介绍了同一文件中的列之间的AWK查找(类似于VLOOKUP)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个输入文件。 我需要扫描第3列中第1列和第2列的值/编号,如果匹配,则打印$1和$2与相应的$4,输出如下所示。 感谢您的任何帮助。
为了匹配$3中的第一列,尝试了此代码,但它不起作用。 逻辑是将$3放入数组并扫描数组中的$1。
awk -F ',' '{a[$3] } { if ($1 in a) {print $1":" $4 } else {print $1, "NA"} }' 1.csv
输入
345,1314,567,index-1
344,1315,566,index-2
343,1316,565,index-3
342,1317,1316,index-4
241,1318,563,index-5
340,1319,562,index-6
439,1320,561,index-7
318,1333,337,index-8
337,1335,559,index-9
236,1336,558,index-10
,,311,index-11
,,1314,index-12
,,1333,index-13
,,3444,index-14
,,344,index-15
,,2008,index-16
,,342,index-17
,,1320,index-18
,,543,index-19
,,340,index-20
,,12233,index-21
输出
345:#N/A
344:index-15
343:#N/A
342:index-17
241:#N/A
340:index-20
439:#N/A
318:#N/A
337:index-8
236:#N/A
1314:index-12
1315:#N/A
1316:index-4
1317:#N/A
1318:#N/A
1319:#N/A
1320:index-18
1333:index-13
1335:#N/A
1336:#N/A
推荐答案
$ cat nash.awk
NR == FNR { a[$3] = $4; next }
($1 in a) { print $1 ":" a[$1] }
($2 in a) { print $2 ":" a[$2] }
$1 && !($1 in a) { print $1 ": #N/A"}
$2 && !($2 in a) { print $2 ": #N/A"}
请注意,在awk脚本执行两次遍历时,我们提供了两次文本文件(请参阅下面的更多说明):
$ awk -F, -f nash.awk nash.txt nash.txt
1314:index-12
345: #N/A
344:index-15
1315: #N/A
1316:index-4
343: #N/A
342:index-17
1317: #N/A
241: #N/A
1318: #N/A
340:index-20
1319: #N/A
1320:index-18
439: #N/A
1333:index-13
318: #N/A
337:index-8
1335: #N/A
236: #N/A
1336: #N/A
解释:
NR == FNR { a[$3] = $4; next }
当NR==FNR时,我们知道我们是第一次读取文件。在这里,我们保存与$3
对应的所有$4
值。next
表示跳过所有其他命令。
($1 in a) { print $1 ":" a[$1] }
如果我们在这里,我们知道我们正在第二次读取文件。检查字段%1是否与任何字段%3匹配,如果匹配,则将其与在上述步骤中保存的字段%4一起打印。
($2 in a) { print $2 ":" a[$2] }
与上面相同,但针对第二个字段。
$1 && !($1 in a) { print $1 ": #N/A"}
同样,如果未找到第一个字段,则打印N/A消息。
$2 && !($2 in a) { print $2 ": #N/A"}
第二个字段的名称如上。
这篇关于同一文件中的列之间的AWK查找(类似于VLOOKUP)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文