우분투 명령 - awk - 접두사가 다른 파일 목록

우분투 명령 - awk - 접두사가 다른 파일 목록

동일한 접두사로 시작하는 많은 수의 파일과 파일 하위 그룹을 포함하는 Ubuntu 시스템에 디렉터리가 있습니다. 아래와 같이 디렉터리 파일 이름에 있는 다양한 접두사 목록이 필요합니다. 목록의 경우:

pj6_ex_18_i535_tr_92.pdf
pj6_ex_18_i535_tr_95.pdf
...
pj6_ex_14_i535_tr_96.pdf
pj6_ex_14_i535_tr_97.pdf
pj6_ex_14_i535_tr_98.pdf
....
pj1_ex_24_i535_tr_91.pdf
pj1_ex_24_i535_tr_92.pdf
pj1_ex_24_i535_tr_93.pdf
...
pj3_ex_16_i535_tr_23.pdf
pj3_ex_16_i535_tr_22.pdf

다음 목록을 가져와야 합니다. awk 명령을 통해 이것이 가능할 것 같지만 방법을 모르겠습니다.

pj6_ex_18_
pj6_ex_14_i535_
pj1_ex_24_i535_
pj3_ex_16_i535_

어떻게 해야 하나요?

답변1

$ perl -lne '
    s/_tr.*/_/;
    unless (defined($prefixes) && m/^($prefixes)_/) {
      $prefixes{$_}++;
      $prefixes=join("|", map +( "\Q$_\E" ), keys %prefixes);
    };

    END { print join("\n", sort keys %prefixes) }' <(sort input.txt)
pj1_ex_24_i535_
pj3_ex_16_i535_
pj6_ex_14_i535_
pj6_ex_18_i535_

또는 더 짧게 말하면 모든 고유 접두사 대신 표시되는 마지막 줄을 추적하면 됩니다.

$ perl -lne '
    next if (defined($last) && m/^\Q$last\E/);
    s/_tr.*/_/;
    $last=$_;
    print' <(sort input.txt)
pj1_ex_24_i535_
pj3_ex_16_i535_
pj6_ex_14_i535_
pj6_ex_18_i535_

두 버전 모두에서 \Q일치 작업의 및 ​​는 정규식 메타 문자가 포함되는 것을 방지합니다. 예를 들어 "리터럴 및 리터럴"과 같은 내용이 포함되어 있으면 "0개 이상의 문자" "로 해석됩니다.\Em//$last.*.*

관련 정보