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



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

File2

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

你能帮我完成正确的输出吗。提前感谢

$ 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

Unix联接命令可用于此

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:基于文件1的第5个字段和文件2的的第1个字段加入

-o1.1,1.2,1.3,1.4,1.5,1.6,2.2:从文件1输出6个字段,从文件2 输出第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)

假设两个文件的IP地址顺序相同,如OP的示例所示

paste -d'' file1 <(cut -d' ' -f2 file2)
  • cut -d' ' -f2 file2选择文件2的第二列,列分隔符为分隔符-d' '指定的空格字符
  • 使用进程替换,cut命令的输出作为文件输入传递给paste命令
  • 然后,paste命令按列组合文件1和cut的输出,其间不包含任何字符(引用:粘贴时不带分隔符)

相关内容

  • 没有找到相关文章

最新更新