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
的输出,其间不包含任何字符(引用:粘贴时不带分隔符)