bash - 合并具有相同第 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
我应该如何操作代码以获得所需的结果?
解决方案
你可以使用这个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
推荐阅读
- intellij-idea - 我应该如何运行同时更新 intellij 设置插件中的 UI 的后台任务
- react-native - 如何在 React Native 中创建导航抽屉?
- android - 是否可以在 xml 中定义 ScrollView 的初始位置?
- git - 如果显示令牌,Windows 的 git credential manager core 如何安全
- javascript - 在活动的 Internet 浏览器选项卡上自动刷新
- nanohttpd - 在 Android 中使用 Nanohttp 时如何获取 Api Caller URL
- html - 博客中没有小部件时如何隐藏“部分”
- java - 如何将数据从 ViewModel 内的线程发送到主 Activity/Fragment?
- c# - C# DbContext.Add 奇怪的行为
- c - 如何从字符串中删除重复的元音?