File1中
abcd-efg|random1||abcd|10.10.1.1||
bcde-ab|random2||bc|10.1.2.2||
efgh-bd|ramdom3||fgh|10.2.1.1||
ijkl|random4||mno|10.3.2.3||
文件2
10.10.1.1| yes
10.1.2.2| no
10.2.1.1| yes
10.3.2.3| no
输出应为
abcd-efg|random1||abcd|10.10.1.1||yes
bcde-ab|random2||bc|10.1.2.2||no
efgh-bd|ramdom3||fgh|10.2.1.1||yes
ijkl|random4||mno|10.3.2.3||no
我试图使用awk和join加入基于ip地址的两个文本文件,但有些人无法获得正确的输出。
你能不能帮助我完成正确的输出。谢谢你提前
答案 0 :(得分:0)
$ awk -F'|' 'FNR==NR{a[$1]=$2; next} {print $0 a[$5]}' file2 file1
abcd-efg|random1||abcd|10.10.1.1|| yes
bcde-ab|random2||bc|10.1.2.2|| no
efgh-bd|ramdom3||fgh|10.2.1.1|| yes
ijkl|random4||mno|10.3.2.3|| no
即使IP以不同的顺序存在于文件中,这种方法仍然有效。
-F'|'
将输入的字段分隔符设置为|
。
FNR==NR{a[$1]=$2; next}
当读取第一个文件file2
时,将第二个字段保存为第一个字段键下的关联数组a
中的值。跳过剩余的命令并跳转到next
行。
print $0 a[$5]
如果我们到达此处,我们正在处理第二个文件file1
。打印该行,后跟此IP的a
值。
在BSD(OSX)awk上,尝试:
awk -F'|' 'FNR==NR{a[$1]=$2; next;} {print $0 a[$5];}' file2 file1
答案 1 :(得分:0)
Unix join命令可用于此
join -t\| -j1 5 -j2 1 -o1.1,1.2,1.3,1.4,1.5,1.6,2.2 file1 file2
选项说明:
-t\|
:字段分隔符是' |' (转义)
-j1 5 -j2 1
:基于file1的第5个字段和file2的第1个字段
-o1.1,1.2,1.3,1.4,1.5,1.6,2.2
:输出file1的6个字段和file2的第2个字段
如果输入文件未排序,则需要先对它们进行排序,如下所示
join -t\| -j1 5 -j2 1 -o1.1,1.2,1.3,1.4,1.5,1.6,2.2 <(sort -t'|' -k5 file1) <(sort -t'|' -k1 file2)
答案 2 :(得分:0)
假设两个文件的IP地址与OP的示例中所示的顺序相同
paste -d'\0' file1 <(cut -d' ' -f2 file2)
cut -d' ' -f2 file2
选择file2的第二列,列分隔是由分隔符-d' '
指定的空格字符cut
命令的输出作为文件输入传递给paste
命令paste
命令然后将cut
列的文件1和输出结合起来,两者之间没有任何字符(参考:paste without delimiter)