다음 형식의 데이터가 있습니다.
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'
올바른 방법은 무엇입니까?
샘플 데이터 는 다음과 같습니다 .
답변
bash 사용 하면 트릭을 수행합니다.
$ sort -t$'\t' -k3 -nr file.txt
작은 따옴표로 묶은 문자열 앞에 달러 기호가 있습니다. bash 매뉴얼 페이지 의 ANSI-C Quoting 섹션 에서 이에 대해 읽을 수 있습니다 .
답변
기본적으로 필드 구분 기호는 공백이 아닌 공백으로 전환되므로 탭이 제대로 작동합니다.
그러나 열은 기본 1과 기본 0으로 색인화되므로 원하는 경우
sort -k4nr file.txt
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