Bash 基于公共字段(ip地址)连接两个文本文件
文件1 文件2 输出应该是Bash 基于公共字段(ip地址)连接两个文本文件,bash,file,unix,join,awk,Bash,File,Unix,Join,Awk,文件1 文件2 输出应该是 10.10.1.1| yes 10.1.2.2| no 10.2.1.1| yes 10.3.2.3| no 我试图使用awk和joins连接两个基于ip地址的文本文件,但有些无法获得正确的输出 你能帮我完成正确的输出吗?提前谢谢 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|
10.10.1.1| yes
10.1.2.2| no
10.2.1.1| yes
10.3.2.3| no
我试图使用awk和joins连接两个基于ip地址的文本文件,但有些无法获得正确的输出
你能帮我完成正确的输出吗?提前谢谢
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
如果我们到达这里,我们正在处理第二个文件,打印$0 a[$5]
。打印该IP的行,后跟file1
a
$ 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
如果我们到达这里,我们正在处理第二个文件,打印$0 a[$5]
。打印该IP的行,后跟file1
a
$ 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
Unix join命令可用于此操作
awk -F'|' 'FNR==NR{a[$1]=$2; next;} {print $0 a[$5];}' file2 file1
选项说明:
-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 file1 file2
join-t\|-j15-j21-o1.1,1.2,1.3,1.4,1.5,1.6,2.2Unix join命令可用于此操作
awk -F'|' 'FNR==NR{a[$1]=$2; next;} {print $0 a[$5];}' file2 file1
选项说明:
-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 file1 file2
join-t\|-j15-j21-o1.1,1.2,1.3,1.4,1.5,1.6,2.2假设两个文件的IP地址顺序相同,如OP示例所示
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)
粘贴-d'\0'文件1假设两个文件的IP地址顺序相同,如OP示例所示
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)
粘贴-d'\0'文件1谢谢John,我运行了脚本,但无法获取输出中的最后一列(是和否)。“我错过了什么吗?”巴布好奇地问。我只是把我的答案复制粘贴到我的终端上,它仍然运行良好。请检查并查看您的输入文件是否与问题中显示的文件有任何不同,无论大小。@Babu您是否有可能使用Sun或Solaris?我的疑问是为什么它不能在mac中工作,是否有任何方法可以使它也能在mac中工作?@Babu OSX使用BSD awk,有时需要在语法上做一些小的更改。请查看答案的更新,并让我知道这是否适用于您。(如果没有,请引用完整的错误消息。)谢谢John,我运行了脚本,但无法获得输出中的最后一列(是和否)。“我错过了什么吗?”巴布好奇地问。我只是把我的答案复制粘贴到我的终端上,它仍然运行良好。请检查并查看您的输入文件是否与问题中显示的文件有任何不同,无论大小。@Babu您是否有可能使用Sun或Solaris?我的疑问是为什么它不能在mac中工作,是否有任何方法可以使它也能在mac中工作?@Babu OSX使用BSD awk,有时需要在语法上做一些小的更改。请查看答案的更新,并让我知道这是否适用于您。(如果没有,请引用完整的错误消息。)工作正常。谢谢托马斯。工作正常。谢谢托马斯。