删除以逗号结尾的行上的换行符

时间:2014-12-08 09:09:52

标签: python bash csv kml

我编写的用于生成CSV文件的shell脚本存在一些换行问题,因为我使用了python和bash。我该怎么转(文件名:data.csv):

12:30:42, 
-114.000000, 33.000000, 
0.0, 765, 15, 42, 6
12:31:42, 
-114.100000, 33.000000, 
0.0, 765, 15, 42, 6

到这个(filename:data.csv):

12:30:42, -114.000000, 33.000000, 0.0, 765, 15, 42, 6
12:31:42, -114.100000, 33.000000, 0.0, 765, 15, 42, 6

使用bash - 删除部分换行符但不是全部。

6 个答案:

答案 0 :(得分:1)

通过python,

import re
foo = open('file').read()
file = re.sub(r'(, *)\n', r'\1', foo)
print(file, end='')

上面的代码从以逗号结尾的行后跟零或多个空格的行中删除换行符。

$ python3 file.py
12:30:42, -114.000000, 33.000000, 0.0, 765, 15, 42, 6
12:31:42, -114.100000, 33.000000, 0.0, 765, 15, 42, 6

通过Perl,

$ perl -00pe 's/(, *)\n/\1/g' file
12:30:42, -114.000000, 33.000000, 0.0, 765, 15, 42, 6
12:31:42, -114.100000, 33.000000, 0.0, 765, 15, 42, 6

添加-i参数以保存所做的更改。

perl -i -00pe 's/(, *)\n/\1/g' file

-00选项会打开段落啜食模式。 (, *)\n捕获最后一个逗号和空格,并将其存储到一个组中供以后参考。将匹配的字符替换为组1中的字符会导致删除以\n结尾的那些行上的,个字符。从而为您提供所需的输出。

来自perldoc perlrun:

  

-0 [八进制/十六进制]

     

将输入记录分隔符($ /)指定为八进制或十六进制   数。如果没有数字,则空字符是分隔符。   其他开关可以在数字之前或之后。例如,如果你   有一个版本的find可以打印由终止的文件名   空字符。

     

...

     

特殊值00将导致Perl在段落模式下粘贴文件。   任何值0400或更高将导致Perl整个文件,但是   约定值0777是通常用于此目的的

答案 1 :(得分:0)

使用awk的解决方案就像

$ awk '!(NR%3){print line$0; line=""; next} {line=line$0}' data.csv
12:30:42, -114.000000, 33.000000, 0.0, 765, 15, 42, 6
12:31:42, -114.100000, 33.000000, 0.0, 765, 15, 42, 6

答案 2 :(得分:0)

另一种方式

awk '{$0=l=(a?$0:l$0)}a=!(NR%3)' file

输出

12:30:42, -114.000000, 33.000000, 0.0, 765, 15, 42, 6
12:31:42, -114.100000, 33.000000, 0.0, 765, 15, 42, 6

答案 3 :(得分:0)

data = open("filename").read()
data = data.replace(",\n", ",")
open("filename", "w").write(data)

你已经完成了。

答案 4 :(得分:0)

xargs -n8 < infile

12:30:42, -114.000000, 33.000000, 0.0, 765, 15, 42, 6
12:31:42, -114.100000, 33.000000, 0.0, 765, 15, 42, 6

答案 5 :(得分:0)

你可以用纯粹的Bash来做到这一点:

joined_line=
while IFS= read -r line ; do
    joined_line+=$line
    if [[ ! $line =~ ', '*$ ]] ; then
        printf '%s\n' "$joined_line"
        joined_line=
    fi
done <data.csv

这将删除以逗号后跟零个或多个空格字符结尾的行的换行符。问题标题表示行以逗号结尾,但示例的行以逗号结尾,后跟空格。

对于最后一行以逗号结尾或最后一行未终止的情况,我省略了错误处理。