这可能听起来很复杂,但我无法做到这一点。
考虑:
_ =空间
- =减号
particle_little.csv
是此格式的文件:
waste line to be deleted
__data__data__data
_-data__data_-data
__data_-data__data
我需要particle_std.csv
中的标准csv格式,如下所示:
data,data,data
-data,data,-data
data,-data,data
我正在尝试使用tail
和tr
进行转换,在这里我拆分命令:
tail -n +2 particle_little.csv
删除第一行| tr -s ' '
删除重复的空格| tr '/\b\n \b/' '\n'
删除最开头的空格| tr ' ' ','
更改逗号的空格> particle_std.csv
将其放入输出文件但我得到了这个(没有第4步):
data
data
data
-data
...
最后,文件很大,所以在编辑器中打开几乎是不可能的(我知道可能有超级编辑器)
答案 0 :(得分:1)
我建议您使用awk:
$ cat file
waste line to be deleted
data data data
-data data -data
data -data data
$ awk -v OFS=, '{ $1 = $1 } NR > 1' file
data,data,data
-data,data,-data
data,-data,data
该脚本将输出字段分隔符OFS
设置为,
,并将第一个字段重新分配给自身$1 = $1
,从而导致awk触及每一行(并用逗号替换空格)。打印第一个(NR > 1
之后的行(默认操作是打印行)。
答案 1 :(得分:1)
所以,如果我正确地读你 - 忽略不以空格开头的行。逗号将其他所有内容分开。
我建议UserWarning
:
perl
当给出时:
perl -lane 'next unless /^\s/; print join ",", @F';
在waste line to be deleted
data data data
-data data -data
data -data data
上(或在文件名中指定)输出:
STDIN
这是因为:
data,data,data
-data,data,-data
data,-data,data
删除换行符(并在每个-l
后替换它们);
print
autosplits
-a
将其封装在-n
循环中,逐行迭代 - 从功能上来说,它意味着它就像while ( <> ) {
/ sed
/ grep
一样工作并读取tr
或指定为args的文件。
STDIN
允许指定perl代码段。
在这种情况下:
-e
或任何空格开头的行。\s
生成的@F
)和-a
作为分隔符。 (这会自动插入换行符,因为,
)然后,您可以将输出重定向到文件(-l
)或使用>output.csv
进行编辑。
答案 2 :(得分:0)
您可能应该使用sed
或awk
:
sed -e 1d -e 's/^ *//' -e 's/ */,/g'
在Awk中实现这一目标的一种方法是:
awk 'NR == 1 { next }
{ pad=""; for (i = 1; i <= NF; i++) { printf "%s%s", pad, $i; pad="," } print "" }'
但是在Awk中有更好的方法:
awk 'BEGIN { OFS=","} NR == 1 { next } { $1 = $1; print }' data
BEGIN块设置输出字段分隔符;赋值$1 = $1;
迫使Awk重写输出线; print
打印出来。
我已经离开了第一个Awk版本,因为它显示了不止一种方法,并且在某些情况下,这样的方法可能很有用。但是对于这个任务,第二个Awk版本更好 - 更简单,更紧凑(和Tom Fenech answer同构。)