awk 비교를 위해 배열 사용

awk 비교를 위해 배열 사용

다음 파일이 있습니다.

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$18lineEND{}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$18zmaxxzENDxz[x[i]]

관련 정보