sort 명령은 논리적 순서를 이해합니다.

sort 명령은 논리적 순서를 이해합니다.

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

관련 정보