我编写的用于生成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 - 删除部分换行符但不是全部。
答案 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
这将删除以逗号后跟零个或多个空格字符结尾的行的换行符。问题标题表示行以逗号结尾,但示例的行以逗号结尾,后跟空格。
对于最后一行以逗号结尾或最后一行未终止的情况,我省略了错误处理。