다음 줄을 이전 줄과 병합

다음 줄을 이전 줄과 병합

다음 줄이 포함된 텍스트 파일이 있습니다.

LIN This is the value which I need
      from this line which has a very long line
SHR This1;This2;
     This3;
GYC This is an extra.

출력은 다음과 같아야 합니다.

LIN This is the value which I need from this line whi a very..
SHR This1;This2;This3;
GYC This is an extra.

sedPython으로 구현하기 전에 먼저 이것을 시도했습니다. 그래서 알아냈는데...

sed 's/     //' filename.txt 

위의 코드 조각은 빈 4+1 공백(항상 고정)을 제거하는 한 가지 작업만 수행하지만 이제 정보를 추출할 수 있도록 행을 LINE&SHRT 태그로 이동해야 하므로 어떻게 진행해야 할지 잘 모르겠습니다. 또한 레이블 라인(LINE/SHRT/EKY/EKC/USER 사용)이 계속되면 추가 공백으로 표시됩니다. 새로운 줄이어야 한다면 다음 줄로 계속됩니다.

질문, sed를 사용하여 한 줄을 이전 줄로 이동할 수 있나요? 줄이 계속되는지 또는 끝나는지를 나타내기 위해 공백을 구별하는 방법

답변1

작업을 단순하게 유지하세요.

sed 'H;1h;$!d;g;s/\n  */ /g'

이 짧은 스크립트는 하나 이상의 공백으로 시작하는 모든 줄을 이전 줄에 연결합니다.

작동 방식: H각 행을 예약된 공간에 추가합니다. 줄 바꿈을 피하기 위해 첫 번째 줄이 복사됩니다 1h. 마지막 줄이 아니면 d삭제하고, 아니면 를 사용하여 예약된 공간을 패턴 공간으로 이동합니다 g. 이제 전체 파일이 패턴 공간에 있으므로 s명령은 이제 공백이 있는 모든 줄 바꿈을 단일 공백으로 바꿉니다.

GNU를 사용하면 sed훨씬 더 간단하게 만들 수 있습니다.

sed -z 's/\n  */ /g'

답변2

또 다른 방법 AWK:

awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}' FILE.txt

나가:

LIN This is the value which I need from this line which has a very long line
SHR This1;This2; This3;
GYC This is an extra.
  • $1=$1: 출발선에서 공백을 제거합니다.
  • printf("%s ",$0)줄 끝에서 \n( )를 제거합니다.newline
  • NR%2==0{print ""}짝수 줄의 경우 인쇄 \n( )(예: 2,4,6,...)newline

답변3

/^[A-Z]/        { if (line) { print line }; line =      $0 }
/^ /            { sub(/     /, "")        ; line = line $0 }
END             { if (line) { print line }                 }

awk스크립트는

LIN This is the value which I need from this line which has a very long line
SHR This1;This2;This3;
GYC This is an extra.

질문에 제공된 데이터를 고려하면 file.in.

  1. 첫 번째 블록은 대문자 ASCII 문자로 시작하는 각 줄에 대해 실행됩니다. line내용이 있으면 내용을 출력한 후 현재 입력된 줄을 해당 내용에 저장합니다 line. 이는 이전 입력 "청크"의 구성 라인을 출력하고 다음 출력 라인을 조립하기 시작하는 역할을 담당합니다.

  2. 두 번째 블록은 시작 부분에 공백이 하나 이상 있는 모든 줄에 대해 실행되며 처음 5개의 공백을 제거한 다음 끝에 추가합니다 line. 그러면 입력의 연속 행에서 출력 행이 작성됩니다.

  3. 그 안에 콘텐츠가 있으면 END블록은 저장된 콘텐츠를 출력합니다. line이는 입력의 최종 "청크"에서 출력까지 행을 모으는 일을 담당합니다.

당신은 이것을 실행

$ awk -f script.awk file.in

이 스크립트는 여러 개의 들여쓰기(연속) 행이 있을 수 있는 상황을 처리합니다.

관련 정보