【问题标题】:Combine first two columns of a single csv file into another column将单个 csv 文件的前两列合并到另一列中
【发布时间】:2018-08-17 19:53:00
【问题描述】:

所以我有一个大型 CSV 文件(以 Gb 为单位),其中有多个列,前两列是:

 Invoice number|Line Item Number

我想要一个 unix / linux /ubuntu 命令,它可以合并这两列并创建一个由分隔符“:”分隔的新列,例如:如果发票编号是 64789544,行项目编号是 234533,那么我的合并值应该是

 64789544:234533

真的可以实现吗,如果可以,可以将合并的列添加回源csv文件。

【问题讨论】:

  • 我在评论中回答了您的附加问题!让我知道它是否按预期工作:) 如果它对您有帮助,您可以投票/接受我的回答
  • Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: linux shell csv awk sed


【解决方案1】:

您可以使用以下sed 命令:

$ cat large.csv 
Invoice number|Line Item Number|Other1|Other2
64789544|234533|abc|134
64744123|232523|cde|awc

$ sed -i.bak 's/^\([^|]*\)|\([^|]*\)/\1:\2/' large.csv

$ cat large.csv                                                                                       
Invoice number:Line Item Number|Other1|Other2
64789544:234533|abc|134
64744123:232523|cde|awc

请注意,它会备份您的输入文件以防万一,因此您的文件系统中需要有足够的空间。

说明:

  • s/^\([^|]*\)|\([^|]*\)/\1:\2/ 此命令将替换由| 分隔的CSV 的前两个字段,并将使用将合并两列的反向引用替换为: 的分隔符。

如果您确定自己在做什么,可以将-i.bak 更改为-i 以避免备份CSV 文件。

【讨论】:

  • 艾伦..谢谢你的回答把我带到了更好的地方。几件事,而不是'|'我有','所以我在你有'|'的地方替换了你的命令和 ','。我希望我是对的。其次,有什么方法可以按原样保留列,并将合并的值视为新列。
  • @chandresh_cool: 对于逗号作为分隔符,使用s/^\([^,]*\),\([^,]*\)/\1:\2/ 那么也可以通过使用:s/^\([^|]*\)|\([^|]*\)/\1:\2|\1|\2/ 来实现您的第二个目标(这里我使用| 作为分隔符)。我还建议您在使用大文件之前先在一些小文件上进行测试
  • 谢谢阿拉。对于第二个任务,我尝试了这个; sed -i.bak s/^([^,]*),([^,]*)/\1:\2,\1,\2/ test.csv ,但是没有用。
  • 是的,替换 FS="|"与 FS="," 显然 :)
  • 谢谢艾伦...这行得通。我会接受你的回答。
【解决方案2】:

也许用这个简单的 sed

sed 's/|/:/' infile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多