Text-Processing

如何對 1000 行文件中的每 20 行進行排序,並僅將每個間隔中具有最高值的排序行保存到另一個文件中?

  • June 7, 2022

我有一個包含 1000 行文本的文件。我想以每 20 行間隔對第 4 列進行排序並將輸出列印到另一個文件。有人可以幫我用 awk 或 sed 對它們進行排序嗎?

這是資料結構輸入的範例

  1      1.1350  1092.42    0.0000
  2      1.4645   846.58    0.0008
  3      1.4760   840.01    0.0000
  4      1.6586   747.52    0.0006
  5      1.6651   744.60    0.0000
  6      1.7750   698.51    0.0043
  7      1.9216   645.20    0.0062
  8      2.1708   571.14    0.0000
  9      2.1839   567.71    0.0023
 10      2.2582   549.04    0.0000
 11      2.2878   541.93    1.1090
 12      2.3653   524.17    0.0000
 13      2.3712   522.88    0.0852
 14      2.3928   518.15    0.0442
 15      2.5468   486.82    0.0000
 16      2.6504   467.79    0.0000
 17      2.6909   460.75    0.0001
 18      2.7270   454.65    0.0000
 19      2.7367   453.04    0.0004
 20      2.7996   442.87    0.0000
  1      1.4962   828.64    0.0034
  2      1.6848   735.91    0.0001
  3      1.6974   730.45    0.0005
  4      1.7378   713.47    0.0002
  5      1.7385   713.18    0.0007
  6      1.8086   685.51    0.0060
  7      2.0433   606.78    0.0102
  8      2.0607   601.65    0.0032 
  9      2.0970   591.24    0.0045 
 10      2.1033   589.48    0.0184 
 11      2.2396   553.61    0.0203 
 12      2.2850   542.61    1.1579 
 13      2.3262   532.99    0.0022 
 14      2.6288   471.64    0.0039 
 15      2.6464   468.51    0.0051 
 16      2.7435   451.92    0.0001 
 17      2.7492   450.98    0.0002 
 18      2.8945   428.34    0.0010 
 19      2.9344   422.52    0.0001 
 20      2.9447   421.04    0.0007 

預期輸出:

11      2.2878   541.93    1.1090 
12      2.2850   542.61    1.1579 

使用 GNUsort和 GNU split,您可以做到

split -l 20 file.txt --filter "sort -k 4|tail -n 1"

該文件split以 20 個lines 的數據包為單位,然後該filter選項通過給定的命令過濾每個數據包,因此它們sort由第 4 個key 獲取,並且只有最後一行(最大值)由tail.

通過awk

NR%20==1 {max=$4 ; line=$0}
{ if ($4>max) {max=$4;line=$0} }
NR%20==0 {print line}

引用自:https://unix.stackexchange.com/questions/705263