다음과 같은 열 헤더가 있습니다.
EntryDate,HH_ID,HH_type,ID#,Age,First,Last,Gender,Race,Ethnicity,CaseWorkerName
완벽하게 일치하는 약 2000개의 데이터 행이 있습니다.
CaseWorkerName
다른 열의 모든 값을 정렬하고 정렬하고 싶습니다 .
이를 달성하는 가장 좋은 방법은 무엇입니까?
답변1
11열 입니다 CaseWorkerName
. sort
정렬 기준이 되는 열과 열을 지정할 때 사용할 구분 기호를 유틸리티에 알릴 수 있습니다.
$ sort -t ',' -k11,11 data.in
sort
이는 쉼표를 구분 기호로 사용하고 11열에서 11열까지(즉, 11열만) 사전순 오름차순으로 정렬함을 나타냅니다 .
출력은 콘솔에 기록됩니다. 출력을 다른 파일에 저장하려면 다음을 사용하십시오.
$ sort -t ',' -k11,11 -o data.out data.in
data.in
이 플래그를 사용하여 -o
출력 파일을 지정할 수 있습니다 .
첫 번째 행(열 헤더가 포함될 수 있음)을 정렬하지 않으려면 먼저 데이터에서 헤더를 분리해야 합니다.
$ head -n 1 data.in >data.header
$ sed '1d' data.in >data.unsorted
그런 다음 정렬된 데이터를 정렬하고 헤더와 다시 결합합니다.
$ sort -t ',' -k1,11 -o data.sorted data.unsorted
$ cat data.header data.sorted >data.out
$ rm data.sorted data.header data.unsorted
아니면 더 짧게
$ sed '1d' data.in | sort -t ',' -k11,11 -o data.sorted
$ head -n 1 data.in | cat - data.sorted >data.out
$ rm data.sorted
GNU coreutils를 사용하는 Linux 시스템에서는 이 시간이 더 짧을 수 있습니다.
$ ( head -n 1; sort -t ',' -k11,11 ) <data.in >data.out
GNU coreutils 구현을 사용하면 head
subprocess( (...)
)의 표준 입력이 먼저 소비되고 head
나머지 데이터가 공급됩니다 sort
. 하위 프로세스의 출력은 의 출력이고 head
그 다음에는 의 출력이 따릅니다 sort
.
다른 시스템에서는 head
표준 입력 스트림에서 예상보다 더 많은 것을 소비할 수 있으며, 이는 sort
아무것도 제공하지 않습니다(또는 적어도 파일의 나머지 부분은 제공하지 않음). 적어도 OpenBSD에서는요.
결과는 data.out
위의 각 예를 따릅니다.
열의 데이터에 쉼표가 포함되어 있으면 이러한 방법은 모두 실패합니다.