문제

다음 형식의 데이터가 있습니다.

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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top