Linux 将单个csv文件的前两列合并到另一列中
因此,我有一个大型CSV文件(Gb),其中有多个列,前两列是:Linux 将单个csv文件的前两列合并到另一列中,linux,shell,csv,awk,sed,Linux,Shell,Csv,Awk,Sed,因此,我有一个大型CSV文件(Gb),其中有多个列,前两列是: Invoice number|Line Item Number 我需要一个unix/linux/ubuntu命令,该命令可以合并这两列,并创建一个新列,该列由分隔符“:”分隔,因此对于例如:如果发票号为64789544,行项目号为234533,则我的合并值应为 64789544:234533 真的可以实现吗?如果可以,则可以将合并列添加回源csv文件。您可以使用以下sed命令: $ cat large.csv Invoic
Invoice number|Line Item Number
我需要一个unix/linux/ubuntu命令,该命令可以合并这两列,并创建一个新列,该列由分隔符“:”分隔,因此对于例如:如果发票号为64789544,行项目号为234533,则我的合并值应为
64789544:234533
真的可以实现吗?如果可以,则可以将合并列添加回源csv文件。您可以使用以下
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
请注意,这将需要备份您的输入文件,以防您需要在文件系统中有足够的空间
解释:
此命令将替换CSV的前两个字段,用s/^\([^ |]*\)\124\([^ |]*\)/\ 1:\2/
分隔,并将分隔符替换为
使用反向引用合并两列:
如果您确定正在执行的操作,可以在
-i
中更改-i.bak
,以避免备份CSV文件 也许用这个简单的sed
sed 's/|/:/' infile
谢谢你的回答让我找到了更好的地方。很少有东西,而不是“|”我有“,”,所以我用“,”取代了你的命令。我希望我是对的。其次,是否有任何方法可以保持列的原样,并将合并的值视为一个新列。@chandresh\u cool:对于逗号分隔符,请使用
s/^\([^,]*\),\([^,]*\)/\1:\2/
,然后还可以通过使用s/^\([^ 124;]*\)\([^ 124;]*\)/\ 1:\2/
(我在这里使用作为分隔符来实现第二个目标. 我还建议您在使用大文件之前在一些小文件上测试它。对于第二个任务,我尝试了这个;sed-i.bak s/^([^,]*),([^,]*)/\1:\2、\1、\2/test.csv,但它不起作用。是的,将FS=“|”替换为FS=“,”显然:)感谢Allan…这很有效。我会接受你的回答。我在评论中回答了你的补充问题!让我知道它是否如您所期望的那样工作:)如果它对您有帮助,您可以投票支持/接受我的回答Stack Overflow不是代码编写服务。请出示你的密码。由于堆栈溢出对您隐藏了关闭原因:寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。