基于唯一列合并两个列表文件

时间:2019-03-11 20:25:59

标签: linux awk sed

我有两个文件,一个名为3列的NATLog,另一个是2列的Sourceports,下面是NATLog文件的示例。

NATLog

14 172.18.2.12 445 
50 172.18.24.4 123
80 10.2.123.37 22
68 172.18.1.37 25

我想将NATLog文件的最后一列与Sourceports文件的第一列进行匹配,并将关联的服务作为第四列附加到NATLog文件中

源端口

445 SMB
123 Network Time Protocol (NTP)
22  SSH
25  SMTP(Insecure)

所需的输出

14 172.18.2.12 445 SMB 
50 172.18.24.4 123 Network Time Protocol (NTP)
80 10.2.123.37 22  SSH
68 172.18.1.37 25  SMTP(Insecure)

我正在尝试学习AWK来完成此任务,但是我需要一些帮助,请您能帮助我,谢谢

3 个答案:

答案 0 :(得分:1)

尝试awk,

$ awk ' NR==FNR {x=$1; $1="";a[x]=$0; next } { print $0, a[$3] } ' Sourceports NATLog
14 172.18.2.12 445   SMB
50 172.18.24.4 123  Network Time Protocol (NTP)
80 10.2.123.37 22  SSH
68 172.18.1.37 25  SMTP(Insecure)

$

答案 1 :(得分:1)

<ItemGroup>
    <FluentValidationExcludedCultures Include="be;cs;cs-CZ;da;de;es;fa;fi;fr;ja;it;ko;mk;nl;pl;pt;ru;sv;tr;uk;zh-CN;zh-CHS;zh-CHT">
        <InProject>false</InProject>
    </FluentValidationExcludedCultures> 
</ItemGroup>

<Target Name="RemoveTranslationsAfterBuild" AfterTargets="AfterBuild">
    <RemoveDir Directories="@(FluentValidationExcludedCultures->'$(OutputPath)%(Filename)')" />    
</Target> 

答案 2 :(得分:1)

如果您的目标是显示输出 formatting 并以一致的方式附加协议列,则printf代替print可以提供与上述相同的细粒度格式设置控件在man 3 printf中(大多数情况下)。在您的情况下,您只需要获取端口号字段的length()并将其从所需的总字段宽度中减去,即可从NATLog的记录之后添加那么多的空格,然后再附加来自{的已保存协议{1}}。

您可以执行以下操作,其中以字段总宽度为4为例:

Sourceports

输出

$ awk '
    NR==FNR {pcl[$1] = $2; next} {printf "%s%*s%s\n",$0,4-length($3)," ",pcl[$3]}
' Sourceports NATLog

注意:您的14 172.18.2.12 445 SMB 50 172.18.24.4 123 Network 80 10.2.123.37 22 SSH 68 172.18.1.37 25 SMTP(Insecure) 不能在记录的末尾包含其他空格。如果包含空白,则必须用单独的{{1 }},并相应地调整格式字符串)

Sourceports中通常有很多方法可以完成同一件事,因此您可以对其进行定制以满足您的任何需求。

使用$0$1,$2,$3

一种简短但效率较低的方法是同时使用awkpaste来达成相同的目标。 (基本上只是输出awk的前两个字段,并将paste的内容附加到awk,例如

NATLog

(但这确实会违背学习Sourceports的目的)