![단일 레코드 행에서 결정되지 않은 수의 행을 변환하는 방법](https://linux55.com/image/160049/%EB%8B%A8%EC%9D%BC%20%EB%A0%88%EC%BD%94%EB%93%9C%20%ED%96%89%EC%97%90%EC%84%9C%20%EA%B2%B0%EC%A0%95%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EC%88%98%EC%9D%98%20%ED%96%89%EC%9D%84%20%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
최근에 여기에 같은 질문을 했지만 몇 가지 다른 질문이 있습니다. 전임자:
입력 파일
******************
.WER
+ aaa bbb ccc
+ ddd eee
******************
.SDF
+ zzz xxx yyy
+ iii
+ kkk lll
******************
.XCV
+ uuu vvv ggg
+ hhh qqq
******************
원하는 출력:
******************
.WER aaa bbb ccc ddd eee
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq
******************
그래서 위에서 언급한 것처럼 단 한 줄도 정의되지 않은 파일이 있습니다. 2, 3 또는 4가 될 수 있으며 각 레코드는 ******************로 구분됩니다. 각 레코드의 모든 행을 단일 행으로 변환할 수 있습니까? 정확한 행 수에 대해 성공적으로 사용했습니다 paste -s -d ' \n'
.
답변1
$ sed -e :a -e '$!N;s/ *\n+ / /;ta' -e 'P;D' testfile
******************
.WER aaa bbb ccc ddd eee
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq
******************
http://sed.sourceforge.net/sed1line.txt비슷한 예가 있습니다.
:a
라벨 "a" 생성$!N
마지막 줄($!)이 아닌 경우 다음 줄(및 개행)을 패턴 공간에 추가합니다.s/ *\n+ / /
후행 공백, 줄 바꿈, + 및 그 뒤의 공백을 단일 공백으로 바꿉니다.ta
라벨 a로 다시 이동P
패턴 공간을 인쇄합니다. sed의 - 옵션을 사용하지 않았으므로 이는 두 배의 출력을 생성하므로-n
이제 다음이 필요합니다.D
중복 출력을 제거합니다.
답변2
정말로 awk를 사용하고 싶다면 적어도 GNU awk를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
$ gawk -vRS='\n[*]+' -F'[ ]*\n[+][ ]*' '{NF+=0; ORS=RT} 1' file
******************
.WER aaa bbb ccc ddd eee
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq
******************
이는 단순히 적절한 레코드 및 필드 구분 기호를 설정하고 기본(단일 공백) 필드 구분 기호를 사용하여 레코드를 강제로 다시 조합합니다.