Perl을 사용하여 파일 내용 형식 지정

Perl을 사용하여 파일 내용 형식 지정

다음 형식의 파일이 있습니다.

>Country1 
Aus
trali
a

>Country5
Swi
tzer
land

>Country2
Net
herland
s

다음 형식으로 파일을 출력하고 싶습니다.

>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

답변1

직접적인 Perl솔루션:

$ perl -lne '
    if(/^>/) {printf "%s ", $_;next}
    if(/^$/) {printf "\n";next}
    printf "%s", $_;
' file
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

또는 더 짧은 방법:

$ perl -ane 'BEGIN{$/="";};print "$F[0] ",@F[1..$#F],"\n"' file
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

빈 문자열로 설정하면 $/Perl이 단락 모드로 전환됩니다. 이는 레코드 구분 기호가 하나 이상의 빈 줄임을 의미합니다.

답변2

사용-p변화파일을 한 줄씩 처리하고 처리된 각 줄을 출력합니다. 줄 바꿈 문자로 시작하는 경우 공백으로 바꿉니다 >. 줄 바꿈 문자가 아닌 다른 문자로 시작하면(즉, 비어 있지 않은 경우) 빈 공간으로 바꿉니다.

perl -pe 'if (/^>/) {s/\n/ /} elsif (/^./) {s/\n//}'

답변3

Raku(이전 Perl_6) 사용

raku -ne 'print "$_ " if m/^\>/; .print if m/<alpha>+ $/; .put unless .chars;'  

입력 예:

>Country1
Aus
trali
a

>Country5
Swi
tzer
land

>Country2
Net
herland
s

예제 출력:

>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

@Gilles 덕분에 그는 Perl에서 단일 if/else 문으로 이 작업을 수행할 수 있었습니다. 위의 코드는 print와 의 차이점을 활용하여 세 개의 Raku 문을 사용합니다 put. Raku에서는 print줄 바꿈이 추가되지 않습니다. putRaku에서는 줄 바꿈이 추가됩니다. 게다가 Raku에서는 ~문자열 연결에 물결표 문자가 사용되므로 보간은 다음 "$_ "과 같이 작성할 수 있습니다 $_~" ".

동일 출처 문제에 대한 Raku의 한 가지 (가능한?) 장점은 chars엄격한 유니코드 루틴 구현(NFG 정규화)입니다. 하단의 URL을 참조하세요.

https://6guts.wordpress.com/2015/04/12/this-week-unicode-normalization-many-rts/
https://docs.raku.org/routine/chars
https://raku.org

답변4

입력 행에 탭이 없으면 다음 방법을 사용할 수 있습니다.

$ awk NF infile | awk '{$1=$1};1' | paste - - - - | sed 's/ //2g'
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands

첫 번째 awk는 빈 줄을 제거합니다. 두 번째 awk는 선행/후행 공백을 자릅니다. 붙여넣기 명령(하이픈 4개 포함)은 탭으로 구분된 4줄마다 병합합니다. 마지막으로 sed는 불필요한 탭을 제거합니다. 원하는 경우 첫 번째 탭을 공백으로 바꾸세요.

관련 정보