给定以下带有多行字段的 csv:
"id","text"
"1","line 1
line 2"
"2","line 1
line 2"
"1","line 1
line 2"
...显示为:
第 2 行
第 2 行
第 2 行
如果我使用以下awk
命令根据 id(第 1 列)从此 csv 中删除重复行:
awk -F, '!x[$1]++' 'file-01.csv' > 'file-01-deduped.csv'
我最终得到:
"id","text"
"1","line 1
line 2"
"2","line 1
显示为:
第 2 行
这是一个过于简单化的例子,但看起来awk
不能很好地处理多行字段。也许我错过了一些东西。
其他信息:我正在根据 RFC4180 standards 编写这些 csv - 最值得注意的是,包含换行符、双引号和逗号的字段用双引号括起来。字段内出现的双引号会使用前面的双引号进行转义。
另外,我正在 Node/JS 中编写 csv,但我发现 awk
过去,这是一种非常简单/快速的对非常大的文件进行重复数据删除的方法,但没有一个文件具有多行字段。
我决不受 awk
的约束-我愿意接受任何/所有建议 - 只是想弄清楚我已经尝试过什么。谢谢!
最佳答案
仅使用您显示的示例,请尝试以下 awk
代码。用 GNU 编写和测试 awk
,应该适用于任何 awk
.
awk -F',' '
FNR>1{
sub(/^"/,"",$2)
sub(/"$/,"",$3)
gsub(/"/,"",$1)
print $1 OFS $2 ORS " " $3
}
' <(awk '{printf("%s%s",$0!~/^"/?",":FNR>1?ORS:"",$0)} END{print ""}' Input_file)
解释:简单的解释是,运行第一个 awk
打印单行中的所有行(无论它的行不是从 "
开始的)并将其输出作为输入发送到 main awk
根据要求打印所需的 id 值和所有行值。
关于csv - 从具有多行字段的大型 csv 中删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72008260/