我希望找到在col1和col2中具有相同值的行,并获得其不同的第三列

假设我有这样的数据

City,Sunset,Anna
City,Sunset,Anna
City,Sunset,Ben
City,Sunset,Ben

我想要的输出是:

City,Sunset,"Anna,Ben"

到目前为止,我有这个代码

cat file.txt | sed 's/,/|/2' | awk -F"," '{if (!($1 in a)) a[$1] = $2; else a[$1]=a[$1] "," $2 } END { for (key in a) print key, a[key] }' OFS=,

但我只得到了

City,Sunset,Anna,Anna,Ben,Ben

何时输出应为

City,Sunset,"Anna,Ben"

有谁能帮我弄一下这个吗?

推荐答案

使用任何awk:

$ cat tst.awk
BEGIN { FS=OFS="," }
{
    key = $1 FS $2
    val = $3
}
key != prev {
    if ( NR > 1 ) {
        print prev, "\"" vals "\""
    }
    vals = sep = ""
    prev = key
    delete seen
}
!seen[val]++ {
    vals = vals sep val
    sep = OFS
}
END {
    print prev, "\"" vals "\""
}

$ awk -f tst.awk file
City,Sunset,"Anna,Ben"

如果您在前两个输入字段中有多个不同的值,而不管第三个字段值的顺序如何,这将会起作用.

它将按照值在输入中出现的顺序输出值,并且一次只存储一个密钥对的值,而不是存储整个文件.

例如,给定以下输入:

$ cat file
City,Sunset,Anna
City,Sunset,Ben
City,Sunset,Sue
City,Sunset,Ben
Town,Sunrise,Ben
Town,Sunrise,Phil

它将产生我认为是预期的输出:

$ awk -f tst.awk file
City,Sunset,"Anna,Ben,Sue"
Town,Sunrise,"Ben,Phil"

上面的脚本假定您的输入是按前两个字段的值分组的,如果不是这样,则首先对其运行sort -t, -k1,2.

Linux相关问答推荐

我想显示包含一个方括号的行,方括号可以是开括号,也可以是闭括号.

C++调试器如何知道如何在源代码和可执行文件之间映射行?

如何在脚本中使用sudo修改其他用户的crontab

使用sed命令将记录中的字符串替换为DD-MMM-YYYY日期格式

RabbitMQ 安装后没有自动启动

将行转换为一条

最小的 x86_64 Hello World ELF 二进制文件是什么?

DMA 和内存映射 IO 有什么区别?

如何在 Linux 上捕获原始 HID 输入?

如何指定链接时使用的库版本?

在 Node.JS 中引用相对于应用程序根目录的文件的正确方法

Linux 非阻塞 fifo(按需日志(log)记录)

如何从 linux 的命令行将 Sublime Text 2 文件打开到选项卡,而不是新窗口

scp 使用私钥身份验证将目录复制到另一台服务器

如何运行时调试共享库?

如何在 Linux 中查看日志(log)文件并在查看时应用自定义过滤器?

如何在 linux 或 unix 上找到用户的主目录?

/dev/random 非常慢?

如何拖尾除第一行以外的所有行

Linux 上的 OpenVPN:在命令行中传递用户名和密码