Awk 按定义的行块在升序列和降序列中排序

Awk 按定义的行块在升序列和降序列中排序,awk,Awk,我一直在考虑5行的块,尝试对第2列进行排序。 例如。 第一个块行1到5:按升序对列2排序 第二个块行6到10:按降序排列第2列 在所有文件中执行此操作 输入文件 P 45683.00 39785.00 1 12 P 45685.00 39785.00 1 12 P 45687.00 39785.00 1 12 P 45689.00 39785.00 1 12 P 45691.00 39785.00 1 12 P 45683.00 39795.00 1 12 P 45685

我一直在考虑5行的块,尝试对第2列进行排序。 例如。 第一个块行1到5:按升序对列2排序 第二个块行6到10:按降序排列第2列

在所有文件中执行此操作

输入文件

P 45683.00  39785.00 1 12 
P 45685.00  39785.00 1 12 
P 45687.00  39785.00 1 12 
P 45689.00  39785.00 1 12 
P 45691.00  39785.00 1 12 
P 45683.00  39795.00 1 12 
P 45685.00  39795.00 1 12 
P 45687.00  39795.00 1 12 
P 45689.00  39795.00 1 12 
P 45691.00  39795.00 1 12 
P 45683.00  39805.00 1 12 
P 45685.00  39805.00 1 12 
P 45687.00  39805.00 1 12 
P 45689.00  39805.00 1 12 
P 45691.00  39805.00 1 12 
P 45683.00  39815.00 1 12 
P 45685.00  39815.00 1 12 
P 45687.00  39815.00 1 12 
P 45689.00  39815.00 1 12 
P 45691.00  39815.00 1 12
所需输出

P 45683.00  39785.00 1 12 
P 45685.00  39785.00 1 12 
P 45687.00  39785.00 1 12 
P 45689.00  39785.00 1 12 
P 45691.00  39785.00 1 12 
P 45691.00  39795.00 1 12 
P 45689.00  39795.00 1 12 
P 45687.00  39795.00 1 12 
P 45685.00  39795.00 1 12 
P 45683.00  39795.00 1 12 
P 45683.00  39805.00 1 12 
P 45685.00  39805.00 1 12 
P 45687.00  39805.00 1 12 
P 45689.00  39805.00 1 12 
P 45691.00  39805.00 1 12 
P 45691.00  39815.00 1 12 
P 45689.00  39815.00 1 12 
P 45687.00  39815.00 1 12 
P 45685.00  39815.00 1 12 
P 45683.00  39815.00 1 12 
尝试

awk '/45691.00/{"awk \\$0+0==\\$0 "file | getline x}
{print x"~"FNR"~"$0 | "sort -k2,2n "}'

提前感谢使用GNU awk和asort()

输出:

P 45683.00  39785.00 1 12 
P 45685.00  39785.00 1 12 
P 45687.00  39785.00 1 12 
P 45689.00  39785.00 1 12 
P 45691.00  39785.00 1 12 
P 45691.00  39795.00 1 12 
P 45689.00  39795.00 1 12 
P 45687.00  39795.00 1 12 
P 45685.00  39795.00 1 12 
P 45683.00  39795.00 1 12 
P 45683.00  39805.00 1 12 
P 45685.00  39805.00 1 12 
P 45687.00  39805.00 1 12 
P 45689.00  39805.00 1 12 
P 45691.00  39805.00 1 12 
P 45691.00  39815.00 1 12
P 45689.00  39815.00 1 12 
P 45687.00  39815.00 1 12 
P 45685.00  39815.00 1 12 
P 45683.00  39815.00 1 12 

使用GNU awk和
asort()

输出:

P 45683.00  39785.00 1 12 
P 45685.00  39785.00 1 12 
P 45687.00  39785.00 1 12 
P 45689.00  39785.00 1 12 
P 45691.00  39785.00 1 12 
P 45691.00  39795.00 1 12 
P 45689.00  39795.00 1 12 
P 45687.00  39795.00 1 12 
P 45685.00  39795.00 1 12 
P 45683.00  39795.00 1 12 
P 45683.00  39805.00 1 12 
P 45685.00  39805.00 1 12 
P 45687.00  39805.00 1 12 
P 45689.00  39805.00 1 12 
P 45691.00  39805.00 1 12 
P 45691.00  39815.00 1 12
P 45689.00  39815.00 1 12 
P 45687.00  39815.00 1 12 
P 45685.00  39815.00 1 12 
P 45683.00  39815.00 1 12 
GNU awk用于:

如果您确实想在每次
$3
更改而不是每5行更改时打印,则只需更改:

{ block[$2] = block[$2] $0 ORS }
!(NR % 5) { prt() }
致:

GNU awk用于:

如果您确实想在每次
$3
更改而不是每5行更改时打印,则只需更改:

{ block[$2] = block[$2] $0 ORS }
!(NR % 5) { prt() }
致:


示例输入文件具有以下特征:

  • 第1-5、11-15行,。。。已经分类了
  • 第6-10、16-20行,。。。你是自上而下的
如果是这种情况,那么下面的命令(完全丑陋且不可重用,ahahah)就足够了:

< file1 sed -E 'N;N;N;N;N;N;N;N;N;s/^(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)$/\1\n\6\n\5\n\4\n\3\n\2/' > file2.out
file2.out

示例输入文件具有以下特征:

  • 第1-5、11-15行,。。。已经分类了
  • 第6-10、16-20行,。。。你是自上而下的
如果是这种情况,那么下面的命令(完全丑陋且不可重用,ahahah)就足够了:

< file1 sed -E 'N;N;N;N;N;N;N;N;N;s/^(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)$/\1\n\6\n\5\n\4\n\3\n\2/' > file2.out
file2.out

您是真的尝试每5行排序,还是每次$3更改都排序,而这恰好是当前数据集中的每5行?您是真的尝试每5行排序,还是每次$3更改都排序,而这恰好是当前数据集中的每5行排序?是的,从我使用
asort()
asorti()
到现在已经有好几年了。只要gawk 4.0中引入了
sorted_in
(我们现在使用的是gawk 5.0.1,所以这是一个诡计!),它就像呼吸了一口新鲜空气,因为至少对我来说,它比这两个函数都更容易使用和更直观。我不明白这些函数感觉如何如此不直观。每次我使用它们时都要用谷歌搜索它们。idk,但我总是要查找手册页并阅读大约5次,然后才能编写使用它们的代码。这里有一个索引,它在那里变成了一个值,还有一个创建的数组,当你循环遍历索引时,它有一个值项,这些值是原始数组的索引。。。如果你在那个数组上调用这个函数,你会失去原始的索引,得到其他的索引-我的脑袋总是在旋转,试图找出什么时候调用哪个函数,然后把结果拼凑起来;asort(a…和
a[]
的大小一直在增长:戴普,事情就是这样该死的流感戴:啊,从我使用
asort()
asorti()
到现在已经好几年了。只要gawk 4.0中引入了
sorted_in
(我们现在使用的是gawk 5.0.1,所以这是一个诡计!),它就像呼吸了一口新鲜空气,因为至少对我来说,它比这两个函数都更容易使用和更直观。我不明白这些函数感觉如何如此不直观。每次我使用它们时都要用谷歌搜索它们。idk,但我总是要查找手册页并阅读大约5次,然后才能编写使用它们的代码。这里有一个索引,它在那里变成了一个值,还有一个创建的数组,当你循环遍历索引时,它有一个值项,这些值是原始数组的索引。。。如果你在那个数组上调用这个函数,你会失去原始的索引,得到其他的索引-我的脑袋总是在旋转,试图找出什么时候调用哪个函数,然后把结果拼凑起来;asort(a…和
a[]
的大小一直在增长:戴普,事情就是这样该死的流感D:D
< file1 sed -E 'N;N;N;N;N;N;N;N;N;s/^(.*)\n(.*)\n(.*)\n(.*)\n(.*)\n(.*)$/\1\n\6\n\5\n\4\n\3\n\2/' > file2.out