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