Unix - 여러 줄에 걸쳐 있는 레코드에서 개행 문자를 제거해야 함

Unix - 여러 줄에 걸쳐 있는 레코드에서 개행 문자를 제거해야 함

다음과 같은 파일이 있습니다

"IN001~24Apr16~Hi,
what a way?
oh no!~
not here~"
"IN003~29Apr16~
what a way?
~oh no!
say again.
not again~"

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

"IN001~24Apr16~Hi,what a way?oh no!~not here~"
"IN003~29Apr16~what a way?~oh no!say again.not again~"

awk 또는 sed를 사용하는 모든 솔루션을 매우 환영합니다.

답변1

awk '{ printf "%s",$0 }; /"$/ { print ""; };' inputfile

입력 줄이 큰따옴표로 끝나는 경우에만 출력에 개행 문자가 표시됩니다. 따라서 이 awk코드는 줄 바꿈 없이 모든 입력 줄을 출력합니다. 그런 다음 입력 줄이 a로 끝나는지 확인하고 "그렇다면 개행 문자를 출력합니다.

답변2

$ sed -n -e '/^"/{h;n;}' -e H -e '/"$/{g;s/\n//g;p;}' file
"IN001~24Apr16~Hi,what a way?oh no!~not here~"
"IN003~29Apr16~what a way?~oh no!say again.not again~"

sed명령은...

  • /^"/{h;n;}": 로 시작하는 모든 라인을 예약된 공간( ) 에 복사하고 h, 그 안에 있는 모든 내용을 덮어쓴 후 즉시 다음 입력 라인( n)으로 이동합니다.

  • H: 예약된 공간에 추가 라인이 추가됩니다.

  • /"$/{g;s/\n//g;p;}: 줄이 "예약된 공간에서 끝나는 경우 예약된 공간( )을 차지하고 g줄바꿈이 제거되고(이 줄바꿈은 예약된 공간에 줄이 추가될 때 추가됨) 결과 문자열이 인쇄됩니다.

명령줄은 다음과 같이 압축될 수 있습니다.

$ sed -n '/^"/{h;n;};H;/"$/{g;s/\n//g;p;}' file

관련 정보