我想从 CSV 文件中删除空白,我可以使用 来做到这一点s/\ //g
,但同时我想避免删除具有时间戳的字段之间的空格,例如"06-JAN-15 13:20:00"
:目前它按照预期加入了它们"06-JAN-1513:20:00"
。
一种解决方案是让它删除所有空格,然后 grep for date06-JAN-15
并在其后面添加空格。不太确定如何做到这一点。
示例 CSV 文件:(仅一行)
294335,"17-APR-15 00:00:00 ",6258,"C"," <-----huge blank space--->,"07-JAN-15 00:00:00"
huge blank space
如果不为空,将包含 XML 消息。
答案1
(?<!...)
不是 sed,但这里有一个在 perlre 中使用负后向断言的解决方案。
perl -pe 's/(?<!\d\d-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-\d\d) //g'
答案2
使用磨坊主(mlr
)清理数据中的空白:
$ cat file
294335,"17-APR-15 00:00:00 ",6258,"C"," ","07-JAN-15 00:00:00"
$ mlr --csv -N clean-whitespace file
294335,17-APR-15 00:00:00,6258,C,,07-JAN-15 00:00:00
$ mlr --csv -N --quote-all clean-whitespace file
"294335","17-APR-15 00:00:00","6258","C","","07-JAN-15 00:00:00"
请注意,mlr
删除不必要的引号,除非您还指定--quote-all
(这将引用全部字段)。该-N
选项强制 Miller 将第一行读取为数据记录而不是标题。
答案3
使用awk
:
< input awk 'BEGIN {FS=OFS=","} {gsub(" ", "", $1); gsub(" ", "", $3); gsub(" ", "", $4); gsub(" ", "", $5); print}'
这将具有从每个记录中的第 1 个、第 3 个、第 4 个和第 5 个逗号分隔字段中删除任何空格字符的效果。
答案4
您实际上可以将该文件解析为 CSV 文件,并去掉多余的空格:
ruby -rcsv -ne '
row = CSV::parse_line($_)
puts CSV::generate_line(row.map {|field| field.strip})
' file
294335,17-APR-15 00:00:00,6258,C,"",07-JAN-15 00:00:00