csv - 从具有多行字段的大型 csv 中删除重复行

标签 csv awk

给定以下带有多行字段的 csv:

"id","text"
"1","line 1
line 2"
"2","line 1
line 2"
"1","line 1
line 2"

...显示为:

<表类=“s-表”> <标题> id 文本 <正文> 1 第 1 行
第 2 行 2 第 1 行
第 2 行 1 第 1 行
第 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

显示为:

<表类=“s-表”> <标题> id 文本 <正文> 1 第 1 行
第 2 行 2 第 1 行

这是一个过于简单化的例子,但看起来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/

相关文章:

python - 将 datetime64 系列设置为 pandas dataframe 索引会自动添加时区偏移

javascript - 解析后如何通过回调将内容从服务传递到另一个服务到 Controller ?

linux - 如何在unix中转置或旋转文本文件的数据?

linux - 如何将我的文件拆分成多个文件?

bash - 修改 awk 代码块内的 shell 变量

php - 使用 PHP 将我选择的所有 CSV 文件导入到 Mysql

php - mysql:复制表中的某些行,更改重复行中的信息

windows - 用于拆分 .csv 文件的批处理文件

linux - 在linux中将tab转换为fasta格式

linux - 使用 AWK 从两个文件中减去 n 列