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"
파일은 split
20개의 패킷으로 구성되며 l
옵션 filter
은 주어진 명령으로 각 패킷을 필터링하여 4번째 ey에서 숫자로 구성되고 sort
마지막 줄만 추출됩니다(가장 높은 값).n
k
tail
답변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-