如果该行不以“尾随空格结尾”结束,如何删除换行符

时间:2015-01-17 07:24:42

标签: regex awk sed

This is continuation of a similar question that i posted但是另一个参数是@Jubobs

引出的白色空格

示例数据:

"data","123"    <-spaces
"data2","qwer" <-space
"false","234   <-spaces
     And i'm the culprit"  <-- spaces at the start of line and end of line
"data5","234567"

输出文字应为

"data","123"
"data2","qwer"
"false","234    And i'm the culprit"
"data5","234567"

本质上,我想修复我的csv文件(非常大)

我正在使用sed所以sed中的答案会有很多帮助:)

编辑:为示例文本添加空格

3 个答案:

答案 0 :(得分:2)

您可以尝试类似

的内容
awk '/[a-zA-Z0-9][^"]*$/{ORS=""} /[a-zA-Z0-9]"[^"]*$/{ORS="\n"} 1 '

<强>测试

$ awk '/[a-zA-Z0-9][^"]*$/{ORS=""} /[a-zA-Z0-9]"[^"]*$/{ORS="\n"} 1  ' input
"data","123"
"data2","qwer"
"false","234And i'm the culprit"
"data5","234567"

它的作用是什么?

  • [a-zA-Z0-9][^"]*$会匹配最后没有"的所有行。

    • {ORS=""}将输出记录分隔符设置为""
  • [a-zA-Z0-9]"[^"]*$匹配以"

    结尾的所有行
    • {ORS="\n"}将字段记录分隔符设置为\n

答案 1 :(得分:2)

我在示例输入的末尾添加了一行,其中包含一个以空格开头的字段,因为测试它对于您获得的任何建议解决方案都很重要:

$ cat file
"data","123"
"data2","qwer"
"false","234
And i'm the culprit"
"data5","234567"
"stuff","
foo"

所以你可以看到换行符和空格:

$ sed 's/$/\$/' file
"data","123"   $
"data2","qwer"   $
"false","234   $
And i'm the culprit"$
"data5","234567"$
"stuff","   $
foo"$

如果你只是想删除换行符但是留下尾随的空格,那么这个awk命令就是你所需要的(只有用途来显示换行符)

$ awk '{q+=gsub(/"/,"&"); printf "%s%s",$0,(q%2?"":RS)}' file | sed 's/$/\$/'
"data","123"   $
"data2","qwer"   $
"false","234   And i'm the culprit"$
"data5","234567"$
"stuff","   foo"$

如果你想删除字段中的尾随空格:

$ awk '{q+=gsub(/"/,"&"); if (q%2) sub(/[[:blank:]]+$/,""); printf "%s%s",$0,(q%2?"":RS)}' file | sed 's/$/\$/'
"data","123"   $
"data2","qwer"   $
"false","234And i'm the culprit"$
"data5","234567"$
"stuff","foo"$

在上面的所有情况中,sed命令只是在行的末尾粘贴$以使此示例显示尾随空格,awk命令就是您所需要的。

所有这一切都在计算你到目前为止看到的"q+=gsub(/"/,"&")q%2。如果它是一个奇数(1是{{1}}),那么你就在一个字段的中间,所以不要在该行的末尾打印换行符,否则只需打印通常的记录分隔符,即换行。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;s/^(".*",".*").*/\1/;t;N;s/\n//;ta' file

如果该行包含两个用逗号分隔的双引号字段,请删除最后一个双引号后面的任何内容,然后就完成了。否则,请附加下一行并删除其换行符,然后重试。