删除csv文件中间的换行符

6mzjoqzu  于 2022-12-25  发布在  其他
关注(0)|答案(5)|浏览(267)

我需要清理一个csv文件,看起来像这样:

food;1;ZZ;"lipsum";NR
foobar;123;NA;"asking 
price";NR
foobar;5;NN;Random text;NN
moongoo;13;VV;"Any label";OO

是的,有时没有双引号,但新行只出现在双引号字段。这个问题只发生在第4个字段。
我使用了一个awk命令,现在我有了这个命令:

awk '{ if (substr($4,1,1) == "\"" && substr($4,length($4)) != "\"") gsub(/\n/," ");}' FS=";" input_file

这个awk检查字段的第一个字符是否是双引号,最后一个字符是否不是双引号,然后尝试删除新行,但他显然没有删除它。
我想我错过了一件"简单"的事情,但不知道是什么。
谢谢你的帮助。

z9ju0rcb

z9ju0rcb1#

这可能对您有用(GNU sed):

sed -E ':a;/^[^\"]*(\\.[^\"]*)*("[^\"]*(\\.[^"\]*)*"[^\"]*)*"[^\"]*(\\.[^"\]*)*$/{N;s/\n//;ta}' file

这将匹配任何不对称的双引号(带或不带转义双引号),追加下一行,删除换行符并重复,直到双引号对称。
放弃转义双引号的更简单解决方案:

sed -E ':a;/^[^"]*("[^"]*"[^"]*)*"[^"]*$/{N;s/\n//;ta}' file
3hvapo4f

3hvapo4f2#

您可以使用此awk

awk -F';' -v ORS= '1; {print (NF==4 ? " " : "\n")}' file

food;1;ZZ;"lipsum";NR
foobar;123;NA;"asking price";NR
foobar;5;NN;Random text;NN
moongoo;13;VV;"Any label";OO

工作原理:

  • 此命令最初将ORS设置为空字符。
  • 然后它打印每一行的完整记录。
  • 然后在NF == 4时打印一个空格,否则打印一个换行符。
lf5gs5x2

lf5gs5x23#

使用GNU sed

$ sed -Ez 's/(;"[^"]*)\n/\1/g' input_file
food;1;ZZ;"lipsum";NR
foobar;123;NA;"asking price";NR
foobar;5;NN;Random text;NN
moongoo;13;VV;"Any label";OO
ma8fv8wu

ma8fv8wu4#

对于RT的GNU awk:

$ awk -v RS='"' '!(NR%2){gsub(/\n/,"")} {ORS=RT} 1' file
food;1;ZZ;"lipsum";NR
foobar;123;NA;"asking price";NR
foobar;5;NN;Random text;NN
moongoo;13;VV;"Any label";OO
0lvr5msh

0lvr5msh5#

调整OP当前awk代码的一个想法是:

awk -F';' '
{ if (substr($4,1,1) == "\"" && substr($4,length($4)) != "\"") {    # if we have an incomplete line then ...
     printf $0                                                      # printf, sans a "\n", will leave the cursor at the end of the current line
     next                                                           # skip to next line of input
  }
}
1                                                                   # otherwise print current line
' input_file

# or as a one-liner sans comments:

awk -F';' ' { if (substr($4,1,1) == "\"" && substr($4,length($4)) != "\"") { printf $0; next } } 1 ' input_file

这将产生:

food;1;ZZ;"lipsum";NR
foobar;123;NA;"asking price";NR
foobar;5;NN;Random text;NN
moongoo;13;VV;"Any label";OO

相关问题