【问题标题】:grep or awk or sed to concatenate or merge two files linuxgrep 或 awk 或 sed 连接或合并两个文件 linux
【发布时间】:2018-03-26 07:12:27
【问题描述】:

我有一个 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

【问题讨论】:

  • 使用awk:将file2.yml读入一个数组。然后读取file1.csv,找到端口号对应的数组元素。

标签: linux shell awk sed grep


【解决方案1】:

您能否尝试关注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

【讨论】:

  • 感谢 RavinderSingh,即使使用范围,第一个解决方案也对我有用。我在执行第二个时遇到了麻烦。执行需要很长时间。我错过了什么吗?
  • @andy,当我测试它时,它对我很有效,请您在此命令之前使用set -x 或将set -xawk 命令放在.ksh 脚本中并让我知道它向您展示了什么吗?
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2015-08-01
    • 2011-03-12
    • 2015-02-21
    • 2018-12-16
    相关资源
    最近更新 更多