나는 거대한 4 열 파일에 직면하고 있습니다. 세 번째 열을 기준으로 정렬 된 파일을 stdout에 표시하고 싶습니다.
cat myFile | sort -u -k3
그 트릭을 수행하기에 충분합니까?
sort -u -k3 myFile
,
나는 거대한 4 열 파일에 직면하고 있습니다. 세 번째 열을 기준으로 정렬 된 파일을 stdout에 표시하고 싶습니다.
cat myFile | sort -u -k3
그 트릭을 수행하기에 충분합니까?
sort -u -k3 myFile
,
답변:
sort -k 3,3 myFile
현재 로케일에 의해 정의 된 정렬 순서에 따라 열이 공백 시퀀스 (POSIX / C 로케일의 ASCII SPC 및 TAB 문자)로 구분되어 있다고 가정하면 3 번째 열로 정렬 된 파일을 표시합니다 .
선행 공백은 열에 포함 되며 (기본 구분 기호는 공백이 아닌 공백에서 공백으로 전환됨) 비교를 위해 공백이 무시되지 않는 로케일에서 차이를 만들 수 있습니다. -b
옵션을 사용하여 무시하십시오. 주요 공백.
쉘과 완전히 독립적입니다 (모든 쉘은 해당 명령 행을 동일하게 구문 분석하며 일반적으로 쉘에는 sort
명령이 내장되어 있지 않습니다 ).
-k 3
3 번째 열 (선행 공백 포함)로 시작하는 행 부분을 정렬하는 것 입니다. C 로케일에서 공백 및 탭 문자는 인쇄 가능한 모든 문자보다 순위가 높으므로 일반적으로 -k 3,3
동일한 세 번째 필드가있는 행은 제외하고 동일한 결과를 제공합니다.
-u
동일하게 정렬되는 여러 항목이있는 경우 (즉, 정렬 키가 동일하게 정렬되는 곳 (즉 반드시 같음과 동일하지는 않음 )) 한 줄만 유지하는 것입니다 .
cat
죄수의 명령입니다 고양이 enate은. 당신은 여기에 필요하지 않습니다.
열이 다른 것으로 분리 된 -t
경우 구분 기호를 지정하는 옵션 이 필요합니다 .
주어진 예제 파일 a
$ cat a
a c c c
a b ca d
a b c e
a b c d
로 -u -k 3
:
$ echo $LANG
en_GB.UTF-8
$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b c e
두 번째 줄과 세 번째 줄은 같은 세 번째 열을 갖지만 여기에서 정렬 키는 세 번째 열에서 줄 끝까지이므로 -u
둘 다 유지합니다. 내 로케일의 첫 번째 패스에서 공백이 무시 ␠ca␠d
되기 ␠c␠c
때문에 cad
정렬 cc
합니다.
$ sort -u -k 3,3 a
a b c d
a b c e
a b ca d
위의 세 번째 열이있는 사람들은 하나만 유지됩니다 ␠c
. ␠␠c
(2 개의 선행 공백)이있는 것을 유지 하는 방법에 유의하십시오 .
$ sort -k 3 a
a b ca d
a c c c
a b c d
a b c e
$ sort -k 3,3 a
a b c d
a c c c
a b c e
a b ca d
순서 a b c d
와 a c c c
반대 순서를 확인하십시오 . 첫 번째 경우, 때문에 ␠c␠c
전 종류 ␠c␠d
, 두 번째 경우에 정렬 키 (동일하기 때문에 ␠c
전체 풋의 라인을 비교 마지막 수단 비교) a b c d
전 a c c c
.
$ sort -b -k 3,3 a
a b c d
a b c e
a c c c
a b ca d
공백을 무시하면 처음 3 행의 정렬 키는 동일 c
하므로 ( ) 마지막 수단 비교를 기준으로 정렬됩니다.
$ LC_ALL=C sort -k 3 a
a b c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b c e
a b c d
a c c c
a b ca d
C 로케일에서는 코드 포인트 값 (공백이보다 낮은 코드 포인트가있는 위치)을 기준으로 문자 (단일 바이트)가 정렬되는 패스가 하나만 있으므로 ␠␠c
이전에 ␠c
정렬 c
합니다.
blank
로케일에 따라 공백 및 탭 외에 다른 문자를 포함 할 수있는 열이 분리되어 있습니다.
3,3
있습니까? 왜 안돼 3
?
텍스트 파일 (4 자)에서와 같이 "열"을 이해한다면 다음 네, 솔루션 작동합니다 (또는 sort -u -k3 myFile
허용하는 sort
랜덤 액세스 일부 메모리 절약 마법을 수행). 데이터베이스에서와 같이 "열"을 이해하는 경우-데이터의 전체 엔터티와 구분 기호 및 가변 열 너비가 이해되면 더 큰 것이 필요합니다. 예를 들어 크기별로 ls -l을 정렬합니다.
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(사소한 것과 동일 ls -lS
하지만 예제를 훌륭하게 제공합니다.)
sort -k 1.3,1.3
. ls -l | sort -k5,5n
크기를 정렬합니다.
awk
솔루션은 내가 쉽게 복잡한 정렬 요구 사항에 맞게 수정 needed-- 정확히 무엇인가
sort -g -k column_number
특정 열을 사용하여 숫자가있는 목록을 정렬하는 올바른 명령입니다
awk Velor 라이브러리를 사용할 수 있습니다 .
#!/usr/local/bin/velour -f
{
q[NR] = $3
z[NR] = $0
}
END {
a_sort_by(q, z)
io_puts(q)
}
$ sort -k 1.3,1.3 myfile
파일에 구분 기호가 없으면 세 번째 열에서 myfile 파일을 정렬합니다.
$ cat myfile
ax5aa
aa3ya
fg7ds
pp0dd
aa1bb
$ sort -k 1.3,1.3 myfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
종류의 맨 페이지 :
[...] -k, --key = POS1 [, POS2] POS1 (원점 1)에서 키를 시작하고 POS2 (기본 줄 끝)에서 키를 종료합니다. [...] POS는 F [.C] [ OPTS], 여기서 F는 필드 번호이고 C는 필드의 문자 위치입니다. 둘 다 원점 1입니다. -t 또는 -b가 유효하지 않은 경우 필드의 문자는 선행 공백의 시작부터 계산됩니다. OPTS는 하나 이상의 단일 문자 주문 옵션으로, 해당 키의 전체 주문 옵션보다 우선합니다. 키가 없으면 전체 줄을 키로 사용하십시오.
--key = 1.3,1.3을 사용하면 하나의 필드 (전체 행) 만 있고이 필드의 세 번째 문자 위치를 비교한다고합니다.
sort -u -k3 < myFile
.