여러 필드가 포함된 파일이 있습니다.
12345 some values here
67890 other values maybe
12345 different values here
...등.
보여주고 싶다최근의각 키에 대한 행입니다. 출력은 다음과 같아야 합니다.
67890 other values maybe
12345 different values here
출력에서 키는 고유해야 하며 값(행의 나머지 부분)은 해당 키에 대해 가장 최근에 표시된 값이어야 합니다. 나는 키의 최종 순서에 특별히 관심이 없습니다.
GNU(또는 POSIX) 도구를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
awk '{ data[$1] = $0 } END { for (key in data) print data[key] }' file
data
이렇게 하면 첫 번째 필드를 키로 사용하여 배열의 각 행에 대한 데이터가 저장됩니다 . 동일한 첫 번째 필드가 있는 다른 행이 발견되면 해당 키에 대한 이전 데이터를 덮어쓰게 됩니다.
마지막으로 배열의 모든 데이터를 출력합니다.
향상된 메모리 효율성:
sort -k1,1 -s file |
awk 'NR > 1 && $1 != key { print data } { data = $0; key = $1 } END { print data }'
여기서는 먼저 안정적인 정렬 알고리즘( )을 사용하여 첫 번째 열에서만 파일을 정렬합니다 -s
. 안정적인 정렬 알고리즘을 사용한다는 것은 동일한 키를 가진 행이 출력에서 서로 상대적인 위치를 변경하지 않는다는 것을 의미합니다 sort
.
그런 다음 코드는 awk
단순히 "현재 키"와 해당 키에 대한 최신 데이터를 추적하고 키가 변경될 때(마지막으로) 해당 데이터를 인쇄합니다.
답변2
파일을 뒤집어 각 줄을 출력하겠습니다.첫 번째시간을 확인한 다음 출력을 반전시킵니다.
tac file | awk '!seen[$1]++' | tac