sort -k 2 filename.txt는 두 번째 키를 기준으로 정렬한다는 의미이지만 다음 명령의 의미는 무엇입니까? sort -k 3.3,3.5 이 데이터의 경우: 예: I got this -->
Man in Winter England 1980.12.02
Richrd Fritz Scottland 1960.12.18
Max Winter GB 1955.12.09
Luther Arnold England 1990.05.12
Sebastian Kalle USA 1980.12.14
sort -k 3.3,3.5 data.txt를 사용하여 이 목록에 대한 솔루션을 어떻게 얻을 수 있습니까?
일반적으로 소수점 이하 2자리가 있는 경우 어떻게 정렬합니까?
답변1
입력에 탭이 없다고 가정합니다. 이 명령의 해석은 까다롭습니다.
sort -k3.3,3.5
"세 번째 필드에 있는 세 번째에서 다섯 번째 문자의 하위 문자열로 정렬"을 의미하지만 다음과 같이 필드 앞의 첫 번째 공백부터 계산이 시작됩니다 man sort
.
KEYDEF는 시작 및 중지 위치를 나타내는 F[.C][OPTS][,F[.C][OPTS]]입니다. 여기서 F는 필드 번호이고 C는 필드의 문자 위치입니다. 둘 다 원점 1이고 정지 위치는 기본적으로 줄 끝으로 설정됩니다. -t와 -b가 모두 유효하지 않은 경우 필드의 문자는 이전 공백의 시작 부분부터 계산됩니다.
정렬 순서에 대한 로케일 영향을 방지하려면 LC_ALL=C로 정렬을 실행하십시오.
문자를 하나 더 추가하면 순서가 어떻게 바뀌는지 확인하세요.
LC_ALL=C sort -k3.3,3.6
다음은 정렬에 사용되는 입력 부분을 보여주는 짧은 Perl 스크립트입니다.
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my $field_index = 3;
my $start = 3;
my $stop = 5; # Change to 6 to explain the different order.
while (my $line = <>) {
chomp $line;
my @fields = $line =~ /(\s*\S*)/g;
my $length_before = 0;
$length_before += length $fields[$_] for 0 .. $field_index - 2;
my $from = $start - 1 + $length_before;
my $to = $stop + $length_before;
$_ > length $line and $_ = length $line for $from, $to;
substr $line, $to, 0, '>>';
substr $line, $from, 0, '<<';
say $line;
}
3.3, 3.5의 출력:
Luther Arnold << >>England 1990.05.12
Man in << >>Winter England 1980.12.02
Max Winter << >>GB 1955.12.09
Richrd Fritz << >> Scottland 1960.12.18
Sebastian Kalle << >> USA 1980.12.14
3.3, 3.6의 출력:
Richrd Fritz << >>Scottland 1960.12.18
Sebastian Kalle << >>USA 1980.12.14
Luther Arnold << E>>ngland 1990.05.12
Max Winter << G>>B 1955.12.09
Man in << W>>inter England 1980.12.02