Mee*_*shi 12 text-processing sort
我有一个包含 4n 行的文件。这是它的摘录,包含 8 行
6115 8.88443
6116 6.61875
6118 16.5949
6117 19.4129
6116 6.619
6117 16.5979
6118 19.4111
6115 8.88433
Run Code Online (Sandbox Code Playgroud)
我想要做的是对一个块进行排序,其中每个块由基于第一列的 4 行组成。摘录的输出应如下所示。
6115 8.88443
6116 6.61875
6117 19.4129
6118 16.5949
6115 8.88433
6116 6.619
6117 16.5979
6118 19.4111
Run Code Online (Sandbox Code Playgroud)
iru*_*var 17
一种选择是使用awk每 N 行添加一个初始序列号前缀(在您的情况下为 N=4)。然后将前缀作为主要排序列输入sort
.
N=4 的示例:
awk '{print int((NR-1)/4), $0}' file.txt | sort -n -k1,1 -k2,2 | cut -f2- -d' '
Run Code Online (Sandbox Code Playgroud)
如果这是一次性的并且您不想学习 python、perl 或 awk,您可以使用基本split
和sort
命令。
首先使用以下-l
选项将文件拆分为 4 行块:
split -a 6 -l 4 input_file my_prefix_
for fn in my_prefix_*; do
sort -n -o $fn $fn
done
cat my_prefix_* > output_file
rm my_prefix_*
Run Code Online (Sandbox Code Playgroud)
的sort -n
种类通过的第一列(999 1234之前)的数值。
-a 6
应该处理一个 26^6*4 行的文件。my_prefix_
应该是您使用的目录所独有的。
你可以用 Perl 来做到这一点:
perl -nle '
push @a,$_;
unless($. % 4){
print join "\n",sort {$a <=> $b} @a; # Sort @a, and print its contents
@a = (); # Empty @a to start a new block
}
' your_file
Run Code Online (Sandbox Code Playgroud)
这是如何运作的
-n
--> 为每个输入行运行代码(并将当前行放入$_
)-l
--> 将换行符附加到任何的输出print
-e
--> 将以下字符串作为 Perl 代码执行@a
。$.
保存当前行号,除非该行号不等于 0 模 4,否则我们将继续工作。如果它与0 模 4 同余,则我们已到达行号为 4 倍数的行(块的末尾),在这种情况下,我们按升序对条目进行排序@a
,并打印排序数组中的条目通过换行符连接到标准输出。 归档时间: |
|
查看次数: |
5218 次 |
最近记录: |