다음 줄이 포함된 텍스트 파일이 있습니다.
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.
sed
Python으로 구현하기 전에 먼저 이것을 시도했습니다. 그래서 알아냈는데...
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
.
첫 번째 블록은 대문자 ASCII 문자로 시작하는 각 줄에 대해 실행됩니다.
line
내용이 있으면 내용을 출력한 후 현재 입력된 줄을 해당 내용에 저장합니다line
. 이는 이전 입력 "청크"의 구성 라인을 출력하고 다음 출력 라인을 조립하기 시작하는 역할을 담당합니다.두 번째 블록은 시작 부분에 공백이 하나 이상 있는 모든 줄에 대해 실행되며 처음 5개의 공백을 제거한 다음 끝에 추가합니다
line
. 그러면 입력의 연속 행에서 출력 행이 작성됩니다.그 안에 콘텐츠가 있으면
END
블록은 저장된 콘텐츠를 출력합니다.line
이는 입력의 최종 "청크"에서 출력까지 행을 모으는 일을 담당합니다.
당신은 이것을 실행
$ awk -f script.awk file.in
이 스크립트는 여러 개의 들여쓰기(연속) 행이 있을 수 있는 상황을 처리합니다.