단일 레코드 행에서 결정되지 않은 수의 행을 변환하는 방법

단일 레코드 행에서 결정되지 않은 수의 행을 변환하는 방법

최근에 여기에 같은 질문을 했지만 몇 가지 다른 질문이 있습니다. 전임자:

입력 파일

******************
.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
******************

이는 단순히 적절한 레코드 및 필드 구분 기호를 설정하고 기본(단일 공백) 필드 구분 기호를 사용하여 레코드를 강제로 다시 조합합니다.

관련 정보