如何替换包含" \ n"的文本序列在文本文件中

时间:2015-12-19 22:29:20

标签: regex bash csv tr

这可能听起来很复杂,但我无法做到这一点。

考虑:

_ =空间
- =减号

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

我正在尝试使用tailtr进行转换,在这里我拆分命令:

  1. tail -n +2 particle_little.csv删除第一行
  2. | tr -s ' ' 删除重复的空格
  3. | tr '/\b\n \b/' '\n'删除最开头的空格
  4. | tr ' ' ','更改逗号的空格
  5. > particle_std.csv将其放入输出文件
  6. 但我得到了这个(没有第4步):

    data
    data
    data
    -data
    ...
    

    最后,文件很大,所以在编辑器中打开几乎是不可能的(我知道可能有超级编辑器)

3 个答案:

答案 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)

您可能应该使用sedawk

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同构。)