grep或awk或sed连接或合并两个文件linux

时间:2018-03-26 07:12:27

标签: linux shell awk sed grep

我有一个file1.csv文件,它有四列。

udp,4080,10.11.76.172,10.121.147.99
tcp,22,10.21.146.131,10.131.149.91
tcp,8080,10.56.10.91,10.151.150.90

另一个file2.yml文件如下

ssh_port: "22"
Jenkins_port: 8080
sqlstr_port: "5162-5164"

我需要比较两个文件并根据端口号合并为一个文件。

我尝试过这样的事情。

for port in $(cat file1.csv | cut -d',' -f2); do if [[ $port =~ ..

有没有简单的方法可以根据端口号合并两个文件,我需要输出类似这样的输出。

tcp,22,10.21.146.131,10.131.149.91,ssh_port
tcp,8080,10.56.10.91,10.151.150.90,jenkins_port

2 个答案:

答案 0 :(得分:4)

请问您可以尝试关注awk并告诉我这是否对您有所帮助(这不会考虑您的值在file2中有端口范围)。

awk 'FNR==NR{sub(/:/,"",$1);gsub(/\"/,"",$NF);a[$NF]=$1;next} ($2 in a){print $0,a[$2]}' FIle2.yml  FS="," OFS="," FIle1.csv

编辑: 如果您的文件2中的范围与-分隔,那么以下内容也可以为您提供帮助。

awk 'FNR==NR{sub(/:/,"",$1);gsub(/\"/,"",$NF);if($NF~/-/){num=split($NF,array,"-");for(i=array[1];i<=array[num];i++){a[i]=$1}} else {a[$NF]=$1};next} ($2 in a){print $0,a[$2]}' FIle2.yml  FS="," OFS="," FIle1.csv

现在也添加上述解决方案的非单线形式。

awk '
FNR==NR{
  sub(/:/,"",$1);
  gsub(/\"/,"",$NF);
  if($NF~/-/)                          { num=split($NF,array,"-");
    for(i=array[1];i<=array[num];i++)  { a[i]=$1 }}
  else                                 {a[$NF]=$1}; next }
    ($2 in a)                          { print $0,a[$2]  }
' FIle2.yml  FS="," OFS="," FIle1.csv

答案 1 :(得分:2)

扩展 awk 解决方案,考虑多个端口,例如5162-5164

awk 'NR == FNR{ 
         gsub(/[:"]/, ""); 
         len = split($2, a, "-"); 
         for (i=1; i<=len; i++) ports[a[i]] = $1;
         next 
     }
     $2 in ports{ print $0, ports[$2] }' file2.yml FS=',' OFS=',' file1.csv

输出:

tcp,22,10.21.146.131,10.131.149.91,ssh_port
tcp,8080,10.56.10.91,10.151.150.90,Jenkins_port