我有一个格式如下的 CSV 文件:
id @ word @ information @ other information
有时,第一列会重复出现:
001 @ cat @ makes a great pet @ mice
002 @ rat @ makes a great friend @ cheese
003 @ dog @ can guard the house @ chicken
004 @ cat @ can jump very high @ fish
可以看到,第一行和最后一行在第2列中有重复的数据,我想删除这些重复的(如果第2列完全相同的话)并合并第3列中包含的信息以及第3列中包含的信息四。结果是这样的:
001 @ cat @ ① makes a great pet ② can jump very high @ ① mice ② fish
002 @ rat @ makes a great friend @ cheese
003 @ dog @ can guard the house @ chicken
- 我使用这些符号对数据进行编号:“①”、“②”、“③”等,但“(1)”、“(2)”、“(3)”等将也没事。
如何合并单元格中的数据,以便将第三列中的所有数据组合到一个单元格中,并将第四列中的数据组合到一个单元格中?
最佳答案
所描述的任务相当棘手,如果没有一些 awk 得心应手的工作是无法完成的。使用 mouviciel 描述的技术,我有一个解决方案。
这是 funkychicken.awk:
BEGIN { FS = "@" }
function joinArray(values, sep, len) {
actualSep = "";
for (i = 1; i <= len; i++) {
result = result actualSep values[i];
actualSep = sep;
}
return result;
}
function resetFunkyToken() {
ftok = 0;
}
function funkyToken() {
return "(" ++ftok ")";
}
function trim(text) {
sub(/ *$/, "", text);
return text;
}
{
if ($2 in data) {
resetFunkyToken();
split(data[$2], existingValues, "@");
for (f = 3; f <= 4; f++)
existingValues[f] = " " funkyToken() trim(existingValues[f]) " " funkyToken() $f;
data[$2] = joinArray(existingValues, "@", NF);
}
else {
data[$2] = $0;
}
}
END {
for (item in data)
print data[item];
}
然后执行命令以使用所述数据执行 funkychicken.awk 并对输出进行排序:
$ awk -f funkychicken.awk data.txt | sort
001 @ cat @ (1) makes a great pet (2) can jump very high @ (3) mice (4) fish
002 @ rat @ makes a great friend @ cheese
003 @ dog @ can guard the house @ chicken
我没有使用时髦的标记①②③④⑤⑥⑦⑧⑧⑩⑩,而是使用了不那么时髦的 (1)(2)....
关于bash - 合并 CSV 文件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8713937/