다음 형식의 파일이 있습니다.
>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
줄 바꿈이 추가되지 않습니다. put
Raku에서는 줄 바꿈이 추가됩니다. 게다가 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는 불필요한 탭을 제거합니다. 원하는 경우 첫 번째 탭을 공백으로 바꾸세요.