需要一种方法从记录中间剥离额外的CRLF

时间:2015-10-15 16:42:39

标签: awk newline

我们有一个数据源向我们发送我们需要自动导入系统的文件,但是在一些记录的一个或两个字段中,常常有额外CRLF形式的错误数据。该文件是一个CSV格式文件,最初我以为我已经解决了这个问题:

awk 'NR%2-1{gsub(/\r?\n/, FS)} NR>1{printf RS}1' RS=\" ORS= input.csv > output.csv

对于在引号内有额外CRLF的记录非常有用,但事实证明我们也得到了一些没有引号的记录,这些记录会抛出awk命令。

每个记录中的最后一个字段是一个由4-7个数字组成的数字字段,是否有某种方法可以将其作为参考来保留该字段后面的CRLF并删除其余字段?

或者,有没有办法通过计算字段并在记录中的最后一个字段之前删除字段来剥离CRLF?

输入看起来像这样:

SMITH,John,,,,,,05/10/1966,,USA,USA,A 5551212,"Resides in California, USA",,,,Mill Valley,,,,,USA,"Northern District of California, USA",Individual,,,12/09/2003,18/08/2015,78452
SMITH,Patty,,,,,,05/10/1974,,USA,USA,A 5551212,"Resides in Oregon, USA",,,,Portland,,,,,USA,"District of Oregon, USA",Individual,,,15/09/2002,02/02/2015,121567

问题记录如下所示 - 请注意回车和缺少引号:

SMITH,Bill,,,,,,05/10/1966,,USA,USA,A 5551212,"Resides in California, USA",,,,Mill Valley,,,,,USA,Northern District of
California, USA,Individual,,,12/09/2003,18/08/2015,78452

对于输出,我们需要记录与其他两个记录相同 - 全部在一行:

SMITH,Bill,,,,,,05/10/1966,,USA,USA,A 5551212,"Resides in California, USA",,,,Mill Valley,,,,,USA,Northern District of California, USA,Individual,,,12/09/2003,18/08/2015,78452

1 个答案:

答案 0 :(得分:1)

如果只需删除字段内部CRLF,请尝试以下操作(假设 GNU awk,但可以使用BSD awk以及):

awk -v RS='\r?\n' '/,[[:digit:]]{4,7}$/ { print; next } { printf("%s ", $0) }' input.csv > output.csv
  • /,[[:digit:]]{4,7}$/仅匹配以4-7位数结尾的行,这意味着手头的行是完整记录或是多行记录的 last 行。
    • { print; next }只打印带有终止\n的行(如果您还想输出\r\n,则必须使用printf("%s\r\n", $0)代替。)
  • 然后只为记录片段打印
  • { printf("%s ", $0) },即具有字段内部CRLF的记录,因此继续在下一行;通过使用printf打印它,只打印一个尾随空间,净效果是包含单个记录的多行有效地与输出中的每个空格连接。