2016-01-13 17 views
3

在下面的文件中,我想用单个空格字符分隔第5列中的月份部分和日期部分。在CSV文件的特定列中插入3个字符后的空格

输入文件:

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
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 

5th字段的第一个字符3/.../)具有相同的3个字符(&),接着是space替换。或者,将5th字段开头的字符序列替换为序列(&),然后再替换space

+1

看起来不错 - 我会建议在'-v'和'OFS'之间加一个空格,因为awk的某些版本不会理解它。 –

3

如果您可以假设在所有情况下,3个字母的月份名,没有前面的领域有史以来包含一个逗号,你应该能够做到这一点使用的sed:

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

前四个字段的含义通过零个或多个不是逗号的字符[^,]*后跟一个逗号。月份名称由大写字母后跟两个小写字母来描述。替换是匹配&后的所有内容。

0

这可能为你工作(GNU SED):

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

斯普利特第五组非分隔符为两个,并根据需要安排。

相关问题