1000行ファイル内の20行ごとに並べ替え、各間隔で最も高い値を持つ並べ替え行のみを別のファイルに保存するにはどうすればよいですか?

1000行ファイル内の20行ごとに並べ替え、各間隔で最も高い値を持つ並べ替え行のみを別のファイルに保存するにはどうすればよいですか?

1000行のテキストを含むファイルがあります。 4列目を20行間隔で並べ替え、出力を別のファイルに印刷したいと思います。 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 

各n間隔には、最も高い(固有の)値が1つしかありません。

答え1

渡すawk

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

答え2

GNUsortとGNUを使用すると、split次のことができます。

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

ファイルはsplit20個のパケットで構成され、オプションはl与えfilterられたコマンドで各パケットをフィルタリングして4番目のeyから数字で構成され、sort最後の行のみが抽出されます(最も高い値)。nktail

答え3

awk + ​​sort + cutにDSU(装飾/整列/装飾キャンセル)イディオムを使用してください。

$ awk -v OFS='\t' '(NR==1) || ($1<p){b++} {p=$1; print b, $0}' file |
    sort -k5,5rn | awk '!seen[$1]++' | sort -k1,1n | cut -f2-
  11      2.2878   541.93    1.1090
  12      2.2850   542.61    1.1579

バラよりhttps://stackoverflow.com/questions/71691113/how-to-sort-data-based-on-the-value-of-a-column-for-part-multiple-lines-of-af/71694367#71694367DSUに関する追加情報。

@StéphaneChazelasのコメントで述べたように、GNUソートがある場合は、上記の内容を次のように短縮できます。

awk -v OFS='\t' '(NR==1) || ($1<p){b++} {p=$1; print b, $0}' file |
    sort -k5,5rn | sort -suk1,1n | cut -f2-

関連情報