grep 및 정렬 옵션

grep 및 정렬 옵션

다음과 같은 열 헤더가 있습니다.

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 구현을 사용하면 headsubprocess( (...))의 표준 입력이 먼저 소비되고 head나머지 데이터가 공급됩니다 sort. 하위 프로세스의 출력은 의 출력이고 head그 다음에는 의 출력이 따릅니다 sort.

다른 시스템에서는 head표준 입력 스트림에서 예상보다 더 많은 것을 소비할 수 있으며, 이는 sort아무것도 제공하지 않습니다(또는 적어도 파일의 나머지 부분은 제공하지 않음). 적어도 OpenBSD에서는요.

결과는 data.out위의 각 예를 따릅니다.

열의 데이터에 쉼표가 포함되어 있으면 이러한 방법은 모두 실패합니다.

관련 정보