首页 > 解决方案 > 合并具有相同第 1 列和第 2 列的行

问题描述

我是 bash 的初学者。我有一个 .csv 文件。它包含 3 列(名称、编号和值)。以下是列的内容:

Name,Num,Value 
ex1,10.20.30.40,val1
ex2,20.30.40.30,val2
ex3,10.45.60.20,val3
ex4,10.20.30.40,val1
ex5,20.30.40.30,val2

如果 2 行的第 2 列相同,则它们的第三行也相同。我想合并它们的第二列(以及它们的第三列)相同的行。例如这里我有 2 行,它们的第 2 列是“10.20.30.40”。我希望输出是这样的:

Name,Num,Value 
ex1 ex4,10.20.30.40,val1
ex2 ex5,20.30.40.30,val2
ex3,10.45.60.20,val3

使用此代码,我可以根据需要获得第一个和第二个:

awk 'BEGIN{FS=","} NR==1{print;next} {a[$2]=$2 in a ? a[$2] " " $1 : $1} END{for(i in a) print a[i] "," i}' file

这是输出:

Name,Num,Value
ex1 ex4,10.20.30.40
ex2 ex5,20.30.40.30
ex3,10.45.60.20

但它不显示第三列。我试过这个:

awk 'BEGIN{FS=","} NR==1{print;next} {a[$2]=$2 in a ? a[$2] " " $1 : $1} END{for(i in a) print a[i] "," i "," a[i]}' file

但它没有用,它再次将第一列打印为第三列。像这样:

Name,Num,Value
ex1 ex4,10.20.30.40,ex1 ex4
ex2 ex5,20.30.40.30,ex2 ex5
ex3,10.45.60.20,ex3

我应该如何操作代码以获得所需的结果?

标签: bash

解决方案


你可以使用这个awk

awk 'BEGIN { FS=OFS="," }
NR==1 {
   print
   next
}
{
   k=$2 FS $3
   a[k] = (k in a ? a[k] " ": "") $1
}
END {
   for (i in a) print a[i], i
}' file.csv

Name,Num,Value
ex3,10.45.60.20,val3
ex2 ex5,20.30.40.30,val2
ex1 ex4,10.20.30.40,val1

如果您希望以与问题所示相同的顺序输出,则可以使用此gnu-awk解决方案:

awk 'BEGIN{FS=OFS=","}
NR==1{print; next}
{k=$2 FS $3; a[k] = (k in a ? a[k] " ": "") $1}
END{PROCINFO["sorted_in"] = "@val_str_asc"; for (i in a) print a[i], i}' file.csv

推荐阅读