对行块进行排序

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

一种选择是使用每 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)


Ant*_*hon 7

如果这是一次性的并且您不想学习 python、perl 或 awk,您可以使用基本splitsort命令。

首先使用以下-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_应该是您使用的目录所独有的。


Jos*_* R. 3

你可以用 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,并打印排序数组中的条目通过换行符连接到标准输出。