如何替换文本文件中包含“\n”的文本序列
How to replace a text sequence that includes "\n" in a text file
这听起来可能是重复的,但我做不到。
考虑:
_ = space
- = 减号
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 ' '
删除重复的 spaces
| tr '/\b\n \b/' '\n'
删除最开始的space
| tr ' ' ','
将 spaces 更改为逗号
> particle_std.csv
将其放入输出文件
但是我明白了(没有第 4 步):
data
data
data
-data
...
最后,文件很大,用编辑器打开几乎不可能(我知道有超级编辑器也许可以)
您可能应该为此使用 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 } { = ; print }' data
BEGIN块设置输出字段分隔符;赋值 = ;
强制 Awk 修改输出行; print
打印它。
我保留了第一个 Awk 版本,因为它表明有不止一种方法可以做到这一点,而且在某些情况下,这些方法可能很有用。但是对于这个任务,第二个 Awk 版本更好——更简单、更紧凑(并且与 Tom Fenech's 同构)。
我建议你使用 awk:
$ cat file
waste line to be deleted
data data data
-data data -data
data -data data
$ awk -v OFS=, '{ = } NR > 1' file
data,data,data
-data,data,-data
data,-data,data
脚本将输出字段分隔符 OFS
设置为 ,
并将第一个字段重新分配给它自己 =
,导致 awk 接触每一行(并用逗号替换空格) .第一行之后的行 NR > 1
被打印(默认操作是打印该行)。
因此,如果我没看错 - 忽略 不 以空格开头的行。逗号分隔其他所有内容。
我建议 perl
:
perl -lane 'next unless /^\s/; print join ",", @F';
这个,当给定的时候:
waste line to be deleted
data data data
-data data -data
data -data data
On STDIN
(或在文件名中指定)输出:
data,data,data
-data,data,-data
data,-data,data
这是因为:
-l
去除换行符(并在每个 print
之后替换它们);
-a
自动拆分任何空格
-n
将其包装在一个 while ( <> ) {
循环中,该循环逐行迭代 - 从功能上讲,它的工作方式与 sed
/grep
/tr
相同并读取 STDIN
或指定为参数的文件。
-e
允许指定一个 perl 片段。
在这种情况下:
- 跳过任何不以
\s
或任何空格开头的行。
- 任何其他行,以
,
作为分隔符加入字段(@F
由 -a
生成)。 (这会自动插入一个换行符,因为 -l
)
然后您可以将输出重定向到文件 (>output.csv
) 或使用 -i.bak
就地编辑。
这听起来可能是重复的,但我做不到。
考虑:
_ = space
- = 减号
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 ' '
删除重复的 spaces| tr '/\b\n \b/' '\n'
删除最开始的space| tr ' ' ','
将 spaces 更改为逗号> particle_std.csv
将其放入输出文件
但是我明白了(没有第 4 步):
data
data
data
-data
...
最后,文件很大,用编辑器打开几乎不可能(我知道有超级编辑器也许可以)
您可能应该为此使用 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 } { = ; print }' data
BEGIN块设置输出字段分隔符;赋值 = ;
强制 Awk 修改输出行; print
打印它。
我保留了第一个 Awk 版本,因为它表明有不止一种方法可以做到这一点,而且在某些情况下,这些方法可能很有用。但是对于这个任务,第二个 Awk 版本更好——更简单、更紧凑(并且与 Tom Fenech's
我建议你使用 awk:
$ cat file
waste line to be deleted
data data data
-data data -data
data -data data
$ awk -v OFS=, '{ = } NR > 1' file
data,data,data
-data,data,-data
data,-data,data
脚本将输出字段分隔符 OFS
设置为 ,
并将第一个字段重新分配给它自己 =
,导致 awk 接触每一行(并用逗号替换空格) .第一行之后的行 NR > 1
被打印(默认操作是打印该行)。
因此,如果我没看错 - 忽略 不 以空格开头的行。逗号分隔其他所有内容。
我建议 perl
:
perl -lane 'next unless /^\s/; print join ",", @F';
这个,当给定的时候:
waste line to be deleted
data data data
-data data -data
data -data data
On STDIN
(或在文件名中指定)输出:
data,data,data
-data,data,-data
data,-data,data
这是因为:
-l
去除换行符(并在每个 print
之后替换它们);
-a
自动拆分任何空格
-n
将其包装在一个 while ( <> ) {
循环中,该循环逐行迭代 - 从功能上讲,它的工作方式与 sed
/grep
/tr
相同并读取 STDIN
或指定为参数的文件。
-e
允许指定一个 perl 片段。
在这种情况下:
- 跳过任何不以
\s
或任何空格开头的行。 - 任何其他行,以
,
作为分隔符加入字段(@F
由-a
生成)。 (这会自动插入一个换行符,因为-l
)
然后您可以将输出重定向到文件 (>output.csv
) 或使用 -i.bak
就地编辑。