基于公共字段(ip地址)加入两个文本文件

时间:2016-07-19 01:01:31

标签: bash file unix join awk

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地址的两个文本文件,但有些人无法获得正确的输出。

你能不能帮助我完成正确的输出。谢谢你提前

3 个答案:

答案 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

在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' '指定的空格字符
  • 使用process substitutioncut命令的输出作为文件输入传递给paste命令
  • paste命令然后将cut列的文件1和输出结合起来,两者之间没有任何字符(参考:paste without delimiter