![컬럼에서 고유한 값을 추출하는 방법](https://linux55.com/image/72577/%EC%BB%AC%EB%9F%BC%EC%97%90%EC%84%9C%20%EA%B3%A0%EC%9C%A0%ED%95%9C%20%EA%B0%92%EC%9D%84%20%EC%B6%94%EC%B6%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
10,000개의 열과 117,000개의 행이 있는 데이터 파일이 있습니다. 내 원본 데이터에는 각 열마다 많은 반복이 있습니다. 그것은 같다:
입력 file.txt:
123 124 111
321 124 111
123 000 111
123 111 222
각 열의 각 값의 복사본을 유지하고 싶습니다. 예를 들면 다음과 같습니다.
123 124 111
321 000 222
111
10,000개의 열이 있으므로 모든 열을 함께 처리하는 프로그램이 필요합니다.
답변1
이렇게 하면 5줄의 코드로 필요한 작업을 수행할 수 있습니다(그 중 2줄은 정리 중입니다).
#!/bin/bash
# run this, specifying input file as $1 (parameter 1)
# delete any pre-existing column files from /tmp
find /tmp -maxdepth 1 -name "column*" -delete
# create /tmp/columnN files - each file holds one column of $1
awk '{for (f=1; f<=NF; f++) {print $f >>"/tmp/column"f}}' "$1"
# iterate through column files, sorting and removing duplicates
find /tmp -maxdepth 1 -name "column*" -execdir sort -o \{\} -u \{\} \;
# re-combine columns and output to stdout
paste /tmp/column*
# delete column files from /tmp
find /tmp -maxdepth 1 -name "column*" -delete
(현재 가지고 있는 것과 같은) 열 수가 많은 경우 /tmp/column*을 완전히 확장할 수 없기 때문에 붙여넣기 명령이 실패할 수 있습니다.
출력은 각 열의 출력이 정렬되는 반면, 원래 예제에서는 두 번째 열이 정렬되지 않는다는 점에서 예제와 다릅니다.