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中的答案会有很多帮助:)
编辑:为示例文本添加空格
答案 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
如果该行包含两个用逗号分隔的双引号字段,请删除最后一个双引号后面的任何内容,然后就完成了。否则,请附加下一行并删除其换行符,然后重试。