使用AWK合并具有不同长度的列上的两个文件

时间:2015-01-29 18:46:05

标签: arrays awk merge

我正在尝试合并test1和test2中第1列的两个文件。

test1
::::::::::::::
My Mynose mynose rest
hello
baby two
four
::::::::::::::
test2
::::::::::::::
My  1
hello   2
two 3

test1中的第一列是一个字符串,每个单词应与test2第1列中的确切单词匹配。

所需的输出应为:

My Mynose mynose rest 1
hello 2
baby two 3
four N/A

我尝试过各种变体:

awk 'NR==FNR{a[$1]++; next} n=split($5,x," " );for (i=;i<=n;i++); {if(x[i] in a) print $0,a}' test2 test1

但似乎无法得到正确答案。

有人可以提供帮助吗? 感谢

1 个答案:

答案 0 :(得分:0)

awk 'NR==FNR{a[$1]=$2; next} { { found=0; for(i=1;i<=NF;i++) { if($i in a) { print $0,a[$i]; found=1; break; } } if (!found) { print $0,"N/A"} }' test2 test1

详细代码:

NR==FNR{a[$1]=$2; next}为第一个文件创建第一个字段(word)的数组,第二个字段为值

接下来打开一个新块(仅在第二个文件的每一行上使用(由于第一个块中的下一个)

found=0;设置var以打印N / A未找到

for(i=1;i<=NF;i++) {循环遍历字段(每个单词)NF是字段空间作为默认分隔符的数量

if($i in a) { print $0,a[$i]; found=1; break; }对于每个单词,如果它在数组中($ i将变为$ 1,$ 2等),打印行和相应的值,设置var以了解我们发现的停止循环(如果多个单词匹配则避免多次输入)。

if (!found) { print $0,"N/A"}如果上一个循环没有找到该行的单词,则打印该行和N / A