빈 줄로 구분된 비어 있지 않은 줄의 연속 블록이 포함된 텍스트 파일이 있습니다. 줄을 블록으로 합치고 싶습니다(vi 편집기의 "J" 키와 유사).여기 작업을 수행하는 "cfajohnson"에서 다음 스크립트를 찾았습니다.
awk 'BEGIN { RS = ""; OFS = " "}
{$1 = $1; print }'
그래서 파일을 처리
hello
world
this
is
another
line
주어진
hello world
this is another line
(두 개의 Solaris 시스템(SunOS 5.11 11.1 및 SunOS 5.10 Generic_147440-16)에서 블록이 세 개 이상의 빈 줄로 구분되면 분할 오류가 발생합니다. Linux에서는 두 줄 이상으로 구분되어 있으면 작동합니다. )
awk(Linux) 매뉴얼에서:
Assigning a value to an existing field causes
the whole record to be rebuilt when $0 is referenced.
...
OFS The output field separator, a space by default.
...
RS The input record separator, by default a newline.
생략하면 스크립트가 작동하는 것 같습니다.
RS=" "
BEGIN 블록의 명령문(공백은 RS의 기본값입니다) 이 스크립트가 줄을 결합하고 선행 및 후행 공백을 제거하는 이유를 이해할 수 없습니다.
누군가 이 스크립트가 어떻게 작동하는지 설명해 줄 수 있나요?
답변1
생략해도 된다고 생각하는데 OFS=" "
, RS=""
awk를 넣기 위해서는 , (또는 이에 상응하는 것)이 필수입니다.단락 모드.
GNU awk
매뉴얼에서,4.8 다중 라인 레코드(내가 아는 한 다른 awks도 비슷하게 동작합니다.)
또 다른 기술은 빈 줄로 레코드를 구분하는 것입니다.특별한 배열에 따라 RS 값은 빈 문자열이 되며, 이는 레코드가 하나 이상의 빈 줄로 구분됨을 나타냅니다.RS가 빈 문자열로 설정되면 각 레코드는 항상 처음으로 나타나는 빈 줄로 끝납니다. 다음 레코드는 비어 있지 않은 첫 번째 줄까지 시작되지 않습니다. 한 줄에 몇 개의 빈 줄이 나타나더라도 이는 레코드 구분 기호 역할을 합니다. (빈 줄은 완전히 비어 있어야 하며, 공백만 포함된 줄은 포함되지 않습니다.)
이 모드에서 필드는 여전히 기본적으로 공백으로 구분되지만 공백에는 이제 (단일) 개행 문자가 포함됩니다. 기본산출필드 구분 기호는 단일 공백이므로 각 여러 줄 레코드를 단일 라인 공백으로 구분된 필드로 변환하는 데 필요한 것은 할당의 부작용으로 구현되는 awk
레코드 변수를 강제로 다시 빌드하는 것입니다 . 예$0
$1=$1
유명한 awk 전문 용어 설명, 2부: 텍스트 변환 및 교체,27. 각 줄에서 선행 및 후행 공백(트림)을 제거합니다.