다음 파일이 있습니다.
6180,6180,0,1,,1,0,1,1,0,0,0,0,0,0,0,0,4326,4326,,0.440000,
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
4673,4673,0,1,,1,0,1,1,0,0,0,0,0,0,0,0,1707,1707,,0.000000,
$18에서 $21의 최대값을 인쇄하려면 awk 명령이 필요합니다.
원하는 출력은 다음과 같습니다.
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
이 결과를 얻었지만 다음과 같이 sort 명령을 사용합니다.
sort -t, -k18,18n -k21,21nr | awk -F"," '!a[$18]++'
단일 awk 명령으로 수행하고 싶지만.
조언해주세요,
답변1
awk
나는 당신 이 명령으로 그것을하고 싶은 이유를 이해하지 못합니다 . 당신이 가진 것은 꽤 좋아 보입니다. 어쨌든 한 가지 방법은 다음과 같습니다.
$ awk -F, '(max[$18]<$21 || max[$18]==""){max[$18]=$21;line[$18]=$0}
END{for(key in line){print line[key]}}' file
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
아이디어는 간단합니다. 키와 값 max
으로 두 개의 배열이 있습니다 . 각 행에 대해 저장된 값이 보다 작 거나 저장된 값이 없으면 현재 행( )을 배열의 값으로 저장 합니다 . 마지막으로 블록에서 배열을 인쇄합니다 .$18
$21
$18
$21
$18
$0
$18
line
END{}
line
위의 스크립트는 이를 $18
문자열로 처리합니다. 따라서 001
및 는 1
다른 문자열로 처리됩니다.
답변2
uniq
대신 사용하는 것이 조금 더 빠릅니다 awk
.
sort -t, -k18,18nr -k21,21nr | uniq -s39 -w4
답변3
다음을 시도해 볼 수 있습니다 awk
.
awk -F"," '{ if (max[$18] < $21) { max[$18] = $21; x[$18] = NR; } z[NR] = $0; } END { for (i in x) print z[x[i]]; }' file
열 키 와 행 번호 키 max
가 있는 3개의 배열을 사용합니다 . 최대값, 최대값을 포함하는 줄 수 및 파일의 각 줄을 저장 합니다 . 배열의 각 키에 대한 블록 내에서 값을 인쇄합니다 . 이 솔루션은 전체 파일을 메모리로 읽어들이기 때문에 대용량 파일에는 작동하지 않습니다. x
$18
z
max
x
z
END
x
z[x[i]]