다음은 예제 파일입니다:
1 5 20 40 60
2 1 20 20 20
2 2 30 30 30
4 5 40 40 40
7 2 50 30 30
7 1 20 20 20
두 번째 열(첫 번째 열의 동일한 값)에서 더 큰 값을 가진 중복 행을 제거하고 싶습니다. 첫 번째 열에 고유한 값이 있는 행만 유지하고 싶습니다. 이 경우 중복된 행이 있습니다.
2 1 20 20 20
2 2 30 30 30
그리고
7 2 50 30 30
7 1 20 20 20
이 경우 두 번째 열에서 더 큰 값을 가진 행을 삭제하고 싶습니다.
2 2 30 30 30
그리고
7 2 50 30 30
따라서 내 목표는 다음 파일을 선택하고 생성하는 것입니다.
1 5 20 40 60
2 1 20 20 20
4 5 40 40 40
7 1 20 20 20
내 생각엔 awk에서 이 작업을 수행할 수 있었던 것 같습니다.
sort -nk2 | awk '{if(a[$1]){a[$1]=a[$1] } else {a[$1]=$0}}END{for (k in a) {print a[k]}}' | sort
그러나 작은 파일에는 작동합니다. (약 백만 줄에 달하는 파일의 경우) 좀 더 효율적인 것으로 어떻게 바꿀 수 있나요?
답변1
당신은 이것을 스스로 할 수 있습니다 sort
. 아래에서는 첫 번째 항목이 sort
1열을 기준으로 오름차순으로 정렬된 다음 2열로 정렬됩니다. 그런 다음 sort
열 1의 각 고유 값에 대한 레코드를 선택하는 두 번째 항목으로 파이프됩니다. -s
(안정적 정렬) 플래그를 전달하여 열 1의 각 값에 대한 첫 번째 레코드만 반환되도록 합니다. 이는 이전 정렬로 인해 열 2에서 가장 작은 값을 가진 레코드로 판명됩니다.
sort -k1,1n -k2,2n file | sort -k1,1n -s -u