如何在Linux中根据大数据文件中的列数分割行?

如何在Linux中根据大数据文件中的列数分割行?

我的数据文件如下所示:

1
2 4 5 6 7 19
20
22
24 26 27 
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300

我想将那些超过 4 列的行拆分为较小的行,每行最多包含 4 列。因此输出应该是:

 1
 2 4 5 6 
 7 19
 20
 22
 24 26 27 
 29 30 31 32
 34 40 50 56
 58
 234 235 270 500
 1234 1235 1236 1237
 2300

请问有什么建议吗?请考虑我的真实数据文件很大。

答案1

awk

awk '{ if(NF>4) for(i=5; i<=NF; i+=4) $i = "\n" $i } 1' file

sed

sed 's/ /\n/4;T;P;D' file

perl

perl -lpe '$c = 0; s/ /++$c % 4 ? " " : "\n"/goe' file

输出:

1
2 4 5 6 
7 19
20
22
24 26 27 
29 30 31 32 
34 40 50 56 
58
234 235 270 500
1234 1235 1236 1237
2300

答案2

最简单的方法是后期合并或拉链方法。假设每行的最后一个字符是空格。首先根据要剪切的列将文件分成两部分。

cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2

其次通过后期合并合并文件并删除空行。

paste -d'\n' file1 file2 | sed '/^$/d'

相关内容