在CSV文件

时间:2016-01-13 09:25:04

标签: string csv unix awk sed

在下面的文件中,我想将第5列中的月份部分和日期部分用一个空格字符分开。

输入文件:

22144842,860998142,1001409110,DLY,Jan4 2016,13:00,17:00
22084015,860902007,29465297,DLY,Jan4 2016,08:00,12:00
22034081,860845334,1001392391,DLY,Jan3 2016,13:00,17:00
22159924,861029758,1001411656,DLY,Jan3 2016,13:00,17:00
22068143,853558982,1001397841,DLY,Jan2 2016,13:00,17:00

必需的输出文件:

22144842,860998142,1001409110,DLY,Jan 4 2016,13:00,17:00
22084015,860902007,29465297,DLY,Jan 4 2016,08:00,12:00
22034081,860845334,1001392391,DLY,Jan 3 2016,13:00,17:00
22159924,861029758,1001411656,DLY,Jan 3 2016,13:00,17:00
22068143,853558982,1001397841,DLY,Jan 2 2016,13:00,17:00

如何使用AWK语言或sed命令执行此操作?

3 个答案:

答案 0 :(得分:3)

awk -F, -v OFS=, '{sub(/.../, "& ", $5)}1' File

awk -F, -v OFS=, '{sub(/[A-Za-z]+/, "& ", $5)}1' File

输出:

22144842,860998142,1001409110,DLY,Jan 4 2016,13:00,17:00
22084015,860902007,29465297,DLY,Jan 4 2016,08:00,12:00
22034081,860845334,1001392391,DLY,Jan 3 2016,13:00,17:00
22159924,861029758,1001411656,DLY,Jan 3 2016,13:00,17:00
22068143,853558982,1001397841,DLY,Jan 2 2016,13:00,17:00

3字段的第一个/.../字符(5th)替换为相同的3个字符(&),后跟space。或者,将5th字段开头的字符序列替换为序列(&),后跟space

答案 1 :(得分:3)

如果你可以在所有情况下都假设一个3个字母的月份名称,并且前面的任何一个字段都没有包含逗号,你应该能够使用sed执行此操作:

sed -r 's/([^,]*,){4}[A-Z][a-z]{2}/& /' file

前四个字段由零个或多个字符描述,这些字符不是逗号[^,]*后跟逗号。月份名称由大写字母后跟两个小写字母描述。替换是与&匹配的所有内容,之后添加了空格。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/([^,]{0,3})([^,]*)/\1 \2/5' file

将第五组非分隔符拆分为两个并根据需要进行排列。