更改文本文件的格式

时间:2014-09-23 10:41:33

标签: linux bash unix awk text-processing

我有一个文件,其中包含多行标签分隔数据,格式如下:

1 1 2 2
3 3 4 4
5 5 6 6
...

我想将格式更改为:

1 1
2 2

3 3
4 4

5 5
6 6

有没有太复杂的方法来做到这一点?我没有任何使用awk,sed等的经验。 感谢

3 个答案:

答案 0 :(得分:8)

如果您只想将文件分组为X列,则可以使用xargs -nX

$ xargs -n2 < file
1 1
2 2
3 3
4 4
5 5
6 6

要获得更多控制权并在第4个字段后打印空行,您还可以使用此awk:

$ awk 'BEGIN{FS=OFS="\t"} {for (i=1;i<=NF;i++) printf "%s%s", $i, (i%2?OFS:RS); print ""}' file
1 1
2 2 

3 3
4 4 

5 5
6 6 
        # <-- note there is an empty line here

解释

  • 在奇数字段上,它会在它之后打印FS。
  • 在偶数字段上,打印RS。
  • 注意FS表示字段分隔符,默认为空格,RS表示记录分隔符,默认为新行。由于您有tab作为字段分隔符,我们在BEGIN块中重新定义它。

答案 1 :(得分:6)

这可能是允许自定义的最简单方法

awk '{print $1,$2"\n"$3,$4}' file

对于

之间的一行
awk '{print $1,$2"\n"$3,$4"\n"}' file

尽管如果不需要,fedorquis回答xargs可能是最简单的

正如Ed所指出的,如果字段中有空格,这将无效,可以使用

解决
awk 'BEGIN{FS=OFS="\t"} {print $1,$2 ORS $3,$4 ORS}' file

答案 2 :(得分:0)

通过perl,

perl -pe 's/\t(\d\t\d)$/\n$1\n/g' file

将上述命令的输出提供给sed命令以删除最后一个空行。

perl -pe 's/\t(\d\t\d)$/\n$1\n/g' file | sed '$d'