合并CSV文件中的数据

Vil*_*age 2 csv bash

我有一个格式如下的CSV文件:

id @ word @ information @ other information
Run Code Online (Sandbox Code Playgroud)

有时,第一列重复出现:

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
Run Code Online (Sandbox Code Playgroud)

您可以看到,第一行和最后一行在第2列中有重复数据.我想删除这些重复项(如果第2列完全相同)并合并第三列中包含的信息以及第四列中包含的信息.结果是这样的:

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
Run Code Online (Sandbox Code Playgroud)
  • 我使用这些符号对数据进行编号:"①","②","③"等,但"(1)","(2)","(3)"等也可以. .

如何合并单元格中的数据,以便将来自第三列的所有数据组合在一起形成一个单元格,将第四列中的数据组合在一起形成一个单元格?

Jac*_*ack 5

所描述的任务相当棘手,没有一些方便的工作就无法完成.使用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];
}
Run Code Online (Sandbox Code Playgroud)

然后按照命令执行带有所述数据的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
Run Code Online (Sandbox Code Playgroud)

而不是使用你的时髦代币①②③④⑤⑥⑦⑧⑨⑩我去了较少的时髦(1)(2)....