使用 sed 删除空格但跳过日期时间戳

使用 sed 删除空格但跳过日期时间戳

我想从 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

相关内容