문제
다음 형식의 데이터가 있습니다.
foo<tab>1.00<space>1.33<space>2.00<tab>3
이제 마지막 필드를 기반으로 파일을 정렬하려고했습니다. 다음 명령을 시도했지만 예상대로 정렬되지 않았습니다.
$ sort -k3nr file.txt # apparently this sort by space as delimiter
$ sort -t"\t" -k3nr file.txt
sort: multi-character tab `\\t'
$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
sort: multi-character tab `\\t'
올바른 방법은 무엇입니까?
여기에 있습니다 샘플 데이터.
해결책
사용 세게 때리다, 이것은 트릭을 수행 할 것입니다 :
$ sort -t$'\t' -k3 -nr file.txt
단일 인용 문자열 앞에 달러 표시가 주목하십시오. 당신은 그것에 대해 읽을 수 있습니다 ANSI-C 인용 섹션 세게 때리다 남자 페이지.
다른 팁
기본적으로 필드 구분 기호는 맹금에서 빈 전환이 아니므로 탭이 잘 작동해야합니다.
그러나 열은 인덱싱 된베이스 1 및베이스 0이므로 원할 것입니다.
sort -k4nr file.txt
4 열별로 파일을 정렬하려면 숫자로 역 순서로 정렬합니다. (문제의 데이터에는 5 개의 필드가 있으므로 마지막 필드는 색인 5입니다.)
-t 다음에 실제 탭 문자를 넣고 쉘에서 그렇게하려면 Ctrl -V와 탭 문자를 쳤습니다. 내가 사용한 대부분의 쉘은이 문자 그대로 탭 항목 모드를 지원합니다.
그러나 다른 장소에서 복사 및 붙여 넣기는 일반적으로 탭을 보존하지 않기 때문에주의하십시오.
$ 솔루션은 나에게 효과가 없었습니다. 그러나 실제로 탭 문자 자체를 명령에 넣음으로써 : Sort -t ''-k2
같은 것을 통해 파이프하십시오 awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. 공백을 탭으로 변경합니다.
일반적으로 이와 같은 데이터를 유지하는 것은 사람들이 항상 탭과 공간을 혼란스럽게하기 때문에 피할 수있는 경우에는 큰 일이 아닙니다.
Perl, Python 또는 Ruby와 같은 스크립팅 언어로 문제를 해결하는 것은 매우 간단합니다. 다음은 예제 코드입니다.
#!/usr/bin/perl -w
use strict;
my $sort_field = 2;
my $split_regex = qr{\s+};
my @data;
push @data, "7 8\t 9";
push @data, "4 5\t 6";
push @data, "1 2\t 3";
my @sorted_data =
map { $_->[1] }
sort { $a->[0] <=> $b->[0] }
map { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
@data;
print "unsorted\n";
print join "\n", @data, "\n";
print "sorted by $sort_field, lines split by $split_regex\n";
print join "\n", @sorted_data, "\n";
Windows에서 GNU 정렬 솔루션을 원했지만 위의 솔루션 중 어느 것도 명령 줄에서 저에게 효과가 없었습니다.
Lloyd의 단서를 사용하여 다음 배치 파일 (.bat)이 저에게 효과적이었습니다.
이중 인용문 내에 탭 문자를 입력하십시오.
C:\>cat foo.bat
sort -k3 -t" " tabfile.txt
나는 'General-Numeric-sort'를 사용할 때 Bash Shell의 Cygwin에서 Sort 에이 문제를 겪고있었습니다. 내가 지정한 경우 -t$'\t' -kFg
, 여기서 F는 필드 번호이고 작동하지 않았지만 두 가지를 지정할 때 -t$'\t'
그리고 -kF,Fg
(예 : -k7,7g
7 번째 필드의 경우) 작동했습니다. -kF,Fg
없이 -t$'\t'
작동하지 않았다.
탭 만 사용하여 자신을 더 쉽게 만들려면 공백을 탭으로 바꾸십시오.
tr " " "\t" < <file> | sort <options>