Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 基于公共字段(ip地址)连接两个文本文件_Bash_File_Unix_Join_Awk - Fatal编程技术网

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

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|

文件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||mno|10.3.2.3||no
即使IP以不同的顺序出现在文件中,这种方法也会起作用

工作原理
  • -F'|'

    将输入时的字段分隔符设置为
    |

  • FNR==NR{a[$1]=2;next}

    读取第一个文件时,
    file2
    ,将第二个字段保存为关联数组
    a
    中第一个字段键下的值。跳过其余命令并跳到下一行

  • 打印$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
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]

    如果我们到达这里,我们正在处理第二个文件,
    file1
    。打印该IP的行,后跟
    a

BSD/OSX 在BSD(OSX)awk上,请尝试:

$ 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,有时需要在语法上做一些小的更改。请查看答案的更新,并让我知道这是否适用于您。(如果没有,请引用完整的错误消息。)工作正常。谢谢托马斯。工作正常。谢谢托马斯。