빈 줄로 구분된 두 개의 연속된 줄을 ","(쉼표)로 구분된 한 줄로 인쇄하는 방법

빈 줄로 구분된 두 개의 연속된 줄을 ","(쉼표)로 구분된 한 줄로 인쇄하는 방법

텍스트를 변환하는 방법

St1
number1
1234

St2
number2
456

다음으로 가세요?

st1,number1,1234
st2,number2,1234

답변1

와 함께표준 paste명령:

$ paste -sd ',,\n\0' file
St1,number1,1234
St2,number2,456

s연속된 paste라인, ,file,,새로운 팀,아무것도 없다(생각하는 것처럼 NUL 문자가 아님)은 d구분 기호 역할을 합니다.

또는:

$ paste -d ',,\0' - - - - < file
St1,number1,1234
St2,number2,456

pastes stdin 4 번 ,, ,그리고아무것도 없다d그들 사이의 구분자 로 .

답변2

펄 방식:

$ perl -00 -ne 'print join(",",split(/\n/)) . "\n"; ' file
St1,number1,1234
St2,number2,456

-00Perl의 "단락 모드"를 켭니다 . 여기서 "줄"은 로 정의되므로 \n\n각 단락은 단일 "줄"로 처리됩니다. -n"입력 파일을 한 줄씩 읽고 주어진 스크립트를 각 줄에 적용합니다. 스크립트는 -e입력 줄을 (새 줄: 줄 끝 문자)로 분할한 다음 결과 요소를 연결하는 데 사용됩니다. 이것은 모두 인쇄됩니다 . 후행 개행 문자와 함께.\n,

명확성을 위해 다음과 같이 작성할 수 있습니다.

$ perl -00 -ne '@fields=split(/\n/); $out=join(",",@fields); print "$out\n" ' file
St1,number1,1234
St2,number2,456

아니면 그냥 재미로 이렇게 해보세요.

$ perl -00 -pe '$_=join(",",split(/\n/))."\n";' file
St1,number1,1234
St2,number2,456

답변3

노력하다 awk:

awk '$1=$1' OFS=, RS= file
St1,number1,1234
St2,number2,456

빈 레코드 구분 기호의 대상은 RS"빈 줄"이며 필드(여기서는 $1) 를 할당하면 awk필드의 전체 레코드를 재그룹화하는 데 사용할 수 있습니다 OFS. $10 또는 NULL/비어 있지 않은 것으로 가정됩니다 .

답변4

Perl에서 단락 모드(-00) 사용:

perl -pals -F'\n' -00e 's/.*/@F/s' -- -\"=, file

Perl 프로그레시브 모드:

perl -pe '
  chomp($_.=<>.<>),tr/\n/,/ if/./;
  eof && s/.\K$/\n/;
' file

POSIXly sed:

sed '
  /./{H;$!d;}
  x;y/\n/,/;s/.//
' file

GNU csplit + xargs paste파이프를 사용하여 이를 수행 할 수 있습니다 .

csplit --suppress-matched -sz file '/^$/' '{*}'
printf '%s\n' xx* | xargs -r paste -sd,

Python에서 모듈 groupby메서드 및 목록 이해 사용 itertools:


python3 -c 'import sys, itertools as it

ofs,(rs,ors) = ",","\n" * 2
g = lambda x: not len(x)
h = lambda x: x.rstrip(rs)

with open(sys.argv[1]) as f:
  print(*[ofs.join(igrp) for k,igrp in it.groupby(map(h,f),g) if not k],sep=ors)
' file

산출:-

St1,number1,1234
St2,number2,456

관련 정보