bash - 合并 CSV 文件中的数据

标签 bash csv

我有一个格式如下的 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/

相关文章:

python - 使用 pandas 循环合并大量 csv 文件

python - pandas 不读取指数形式的 csv 数据

bash - 可以CD成文件吗?

arrays - 如何仅使用 Bash 数组反向打印目录的内容?

linux - 我的 bash 脚本有问题

powershell - 导出在列中找到重复值的csv行

linux - 将 HH :MM:SS (hours:minutes:seconds. split seconds) 转换为秒的简单方法

linux - 为什么 OS X 10 中的默认 shell 与 Linux(Mint、Lubuntu...)中的默认 shell 看起来不同?

python - Pandas 向 MySQL 中插入数据

iphone - CHCSV 错误 : unable to allocate memory for length