[linux] 탭으로 구분 된 파일 정렬

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

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