1000줄 파일에서 20줄마다 정렬하고 각 간격에서 가장 높은 값을 갖는 정렬된 줄만 다른 파일에 저장하려면 어떻게 해야 합니까?

1000줄 파일에서 20줄마다 정렬하고 각 간격에서 가장 높은 값을 갖는 정렬된 줄만 다른 파일에 저장하려면 어떻게 해야 합니까?

1000줄의 텍스트가 포함된 파일이 있습니다. 네 번째 열을 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

통과하다 awk:

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

답변2

GNU sort와 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-

관련 정보