tr을 utf-8 기능으로 교체

tr을 utf-8 기능으로 교체

시의 한 줄에서 마지막 단어를 분리하기 위해(모든 운율 목록을 얻기 위해), 나는 이것을 얻기 위해 몇 가지 코드 조각을 함께 사용했습니다.

awk '{print $NF}' input.txt | tr 'A-Z' 'a-z'  | tr -sc 'a-z' '\n' | rev |  sort | uniq | sort -d | rev

다음과 같은 시에 적용해보세요.

Se a ciascun l'interno affanno
Si leggesse in fronte scritto
Quanti mai, che invidia fanno
Ci farebbero pietà! 

알겠어요

fanno
affanno
scritto
piet

보시다시피 "라는 단어가 있습니다.그리스도를 위한 애도"악센트 문자가 누락되었습니다. 이는 tr UTF-8 기능이 없기 때문인 것 같습니다. 이 줄에서 동일한 작업을 수행할 수 있지만 UTF-8 악센트 ​​문자를 보존할 수 있는 tr에 대한 대안이 있습니까?

답변1

tr멀티바이트 문자 및 그 대안 중 일부에 대한 GNU 구현의 제한 사항은 다음과 같습니다.유니코드 문자의 tr 시뮬레이션?.

여기에서 모든 작업을 수행할 수 있습니다 awk(GNU 구현은 최소한 멀티바이트 문자 및 지역화를 지원합니다).

< yourfile awk '{
  last = tolower($NF)
  gsub(/[^[:alpha:]]+/, "\n", last)
  print last}' |
  rev | sort -u | rev

이것은 만든다:


pietà
fanno
affanno
scritto

또는 각 줄에서 마지막 문자 시퀀스를 가져오는 것이 목적인 경우 다음을 사용합니다 perl(로케일에 따라 모든 디코딩을 수행하고 소문자, 역방향, 로케일 조합으로 변환할 수도 있음).

<your-file perl -Mopen=locale -MPOSIX -lne '
  $word{lc $1}++ if /(\p{Letter}+)\P{Letter}*$/;
  END {
    print $_->[0] for
      sort {strcoll($a->[1], $b->[1])}
      map {[$_, scalar reverse $_]} keys %word
  }'

또는 GNU 도구를 사용하십시오.

<yourfile grep -Po '\pL+(?=\PL*$)' | sed 's/.*/\L&/' | rev | sort -u | rev

또는 다음 명령을 사용하여 마지막 문자 시퀀스를 추출합니다 sed.

<yourfile sed -E '/([[:alpha:]]+)[^[:alpha:]]*$/!d;s//\n\L\1/;s/.*\n//' |
  rev | sort -u | rev

첫 번째 작업 이후에 수행하면 더 쉬울 것입니다 rev.

<yourfile rev |
  sed -nE 's/^[^[:alpha:]]*([[:alpha:]]+).*$/\L\1/p' |
  sort -u | rev

답변2

사용행복하다(이전 Perl_6)

raku -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines;  \
        .put for @a.unique>>.flip.sort( *.fc.trans: "àèéìòù" => "aeeiou" )>>.flip;' 

또는

raku -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines; \
        .put for @a.unique.map(*.flip).sort( *.fc.trans: "àèéìòù" => "aeeiou" ).map(*.flip);' 

위는 코드화된 답변입니다.행복하다, 기본적으로 유니코드를 처리하도록 구축되었습니다. 즉, 문자가 lines포함된 경우 (즉, 비어 있지 않은 경우) chars정규 표현식을 통해 하나 이상의 알파벳 문자가 있는 줄의 마지막 요소를 찾습니다 push(파괴적인 요소가 아닌 필수 요소를 긍정적으로 선택합니다). [분할이 공백에서만 수행되므로 결과 요소에 여전히 구두점이 남아 있다는 점을 제외하면 이는 근사치입니다.][*-1]comb<alpha>+splitwordswords

@a배열이 채워지면 (여기서 my @a.=push( … )설탕을 빼주세요my @a = @a.push( … )), @a의 요소는 unique-ified, flipped, sorted 및 flipped back입니다.

정렬은 루틴/매개변수를 통해 수행됩니다 .sort( *.fc.trans: "àèéìòù" => "aeeiou" ). 즉, *정렬된 문자를 기준으로 요소가 정렬됩니다.fc 접는6개의 악센트 문자 trans: "àèéìòù" => "aeeiou". 루틴이 없으면 trans이 6개의 악센트 문자로 끝나는 단어는 목록의 마지막으로 정렬됩니다.

입력 예:

Se a ciascun l'interno affanno
Si leggesse in fronte scritto
Quanti mai, che invidia fanno
Ci farebbero pietà!

예제 출력:

pietà
fanno
affanno
scritto

나는 Pietro Metastasio의 또 다른 시를 시험해 보았습니다.무료. 샘플 출력은 아래에 표시되어 있지만 .join(", ")코드 끝에 쉼표로 구분된 출력(한 줄에 한 단어 대신)을 반환하도록 추가했습니다. 아래 첫 번째 답변그리고전화 trans: "àèéìòù" => "aeeiou", 아래 두 번째 답변아니요부르다 trans: "àèéìòù" => "aeeiou":

~$ perl6 -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines; .put for @a.unique.map(*.flip).sort( *.fc.trans: "àèéìòù" => "aeeiou" ).map(*.flip).join(", "); put("");' file.txt
fa, ha, bella, quella, pena, catena, ragiona, sprona, ancora, talora, pietà, beltà, sciolta, volta, libertà, rinnova, prova, è, piace, spiace, infelice, Nice, ingannatrice, fé, me, penne, avvenne, core, ardore, colore, rossore, te, amante, incostante, fai, mai, guai, spezzai, dì, miei, sei, sdegni, segni, suoi, tuoi, così, dico, antico, parlando, dimando, umano, vano, sdegno, segno, hanno, sanno, dono, ragiono, sono, sincero, primiero, impero, altero, vero, aggiro, miro, curo, procuro, so, passò, appresso, oppresso, stesso, istesso, ingrato, prato, ascolto, volto, cimento, rammento, sento, contento, estinto, istinto, difetto, aspetto, consolar, parlar, sdegnar, trovar, piacer, pensier, soffrir, morir, cor, amor, favor

~$ perl6 -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines; .put for @a.unique.map(*.flip).sort( *.fc ).map(*.flip).join(", "); put("");' file.txt
fa, ha, bella, quella, pena, catena, ragiona, sprona, ancora, talora, sciolta, volta, rinnova, prova, piace, spiace, infelice, Nice, ingannatrice, me, penne, avvenne, core, ardore, colore, rossore, te, amante, incostante, fai, mai, guai, spezzai, miei, sei, sdegni, segni, suoi, tuoi, dico, antico, parlando, dimando, umano, vano, sdegno, segno, hanno, sanno, dono, ragiono, sono, sincero, primiero, impero, altero, vero, aggiro, miro, curo, procuro, so, appresso, oppresso, stesso, istesso, ingrato, prato, ascolto, volto, cimento, rammento, sento, contento, estinto, istinto, difetto, aspetto, consolar, parlar, sdegnar, trovar, piacer, pensier, soffrir, morir, cor, amor, favor, pietà, beltà, libertà, è, fé, dì, così, passò

참고: 하이픈으로 연결된 단어(있는 경우)는 모든 구두점이 제거되므로 분석 중에 구성 단어로 분할됩니다.

관련 정보