【问题标题】:Copying a column from one CSV file to another将列从一个 CSV 文件复制到另一个
【发布时间】:2015-11-21 00:30:40
【问题描述】:

我有以下 CSV 文件

文件 1:

"H1","H2","H3"
"AB","1","xyz"
"AC","2","cfd"

文件 2:

"H4","H5","H6"
"GTF","1","23"
"XFD","1","45"
"DRF","2","35"

这里File2中的H5对应File1中的H2(H5作为外键)

现在我需要在 File2 中添加另一列 H7 对应于 H1 像

File2 所需的输出:

"H4","H5","H6","H7"
"GTF","1","23","AB"
"XFD","1","45","AB"
"DRF","2","35","AC"

我如何在 Unix 环境中使用 awk、sed.. 等来做到这一点

P.S 我不能使用 python、perl 等...

【问题讨论】:

  • 你有权加入和 GNU 排序吗?
  • 是的,我可以访问它们,但 CSV 文件 1 非常大(~3GB)。谢谢!
  • 好吧,我知道排序不是必需的。

标签: bash csv unix awk sed


【解决方案1】:

使用 join 和 sed:

join --header -t, -j 2 file1 file2 -o 2.1,2.2,2.3,1.1 | sed '1s/"H1"/"H7"/'

输出:

"H4","H5","H6","H7" "GTF","1","23","AB" "XFD","1","45","AB" "DRF","2","35","AC"

重要的是两个文件中的第 2 列(没有第一行)按升序排序。


加入的选项(来自man join):

--header:将每个文件的第一行作为字段标题,打印它们而不尝试配对它们

-t CHAR:使用 CHAR 作为输入和输出字段分隔符

-j FIELD: 加入文件 1 和文件 2 的 FIELD

-o FORMAT:在构造输出行时选择列(格式:文件号.列号)

我使用 sed 仅将第 1 行的“H1”替换为“H7”。

【讨论】:

  • 非常感谢,如果你能解释我一点点,我会帮助我很多,因为我来自 java 世界,语法有点难以理解。非常感谢!
  • 感谢回复,如果我不要求更多,是否可以不用排序也能做到这一点,因为排序需要额外的时间,效率会降低
  • 当两个文件中的第二列已经按升序排序时,不需要排序,如您的示例所示。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多