다음과 같은 파일이 있습니다.
------------------------------------------------------------------------------------------------------------------------------------------------------------------
49515 23/6/2014 SL B .OO 2500.00
R ROY 4561235
BEING THE T.E PAID
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
23495 26/7/2014 CL A 2300.00 .00
S DAS 2334167
BEING THE MONEY RECOVERED
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
내가 원하는 출력은 다음과 같습니다.
49515 23/6/2014 SL B .00 2500.00 R ROY 4561235 BEING THE T.E PAID
23495 26/7/2014 CL A 2300.00 .00 S DAS 2334167 BEING THE MONEY RECOVERED
나는 큰 성공 없이 awk에서 다음 코드를 시도했는데, 아이디어는 줄 바꿈을 필드 구분 기호로 설정하고 하이픈(-------) 줄을 레코드 구분 기호로 설정하는 것입니다.
BEGIN {
FS="/n"
RS="^-+$"}
{ print $1,$2,$3}
답변1
이렇게 하면 필요한 작업이 수행됩니다.
awk '/---/ {print buff; buff="";} /[^-]/{buff=buff" "$0}' filename
if-else 블록을 사용할 수도 있습니다.
awk '{if($0 ~ /---/){print buff; buff=""} else {buff=buff" "$0}}' filename
또한 버퍼를 사용하지 않고:
awk '{if($0 !~ /---/){printf "%s ", $0} else print ""}' filename
답변2
거의 다 왔습니다:
$ awk -F'\n' -vRS="-+\n" '($1){print $1,$2,$3; }' file
49515 23/6/2014 SL B .OO 2500.00 R ROY 4561235 BEING THE T.E PAID
23495 26/7/2014 CL A 2300.00 .00 S DAS 2334167 BEING THE MONEY RECOVERED
또는 BEGIN 블록을 선호하는 경우:
awk 'BEGIN{FS="\n"; RS="-+\n"}($1){print $1,$2,$3; }' file
문제( /n
오타로 추정됨)는 의 ^
정의에 and 를 사용했다는 것입니다. 정규식이 내부적으로 어떻게 구현되는지 잘 모르겠지만 실제로는 줄이 아닌 파일의 시작과 끝을 참조하는 것 같습니다. 해결 방법으로 줄 바꿈 끝을 설정했습니다. 그러나 이는 줄 끝에 하나 이상이 있을 수 있으면 끊어진다는 것을 의미합니다. 첫 번째 줄이 실패해서 처음부터 어떻게 맞춰야 할지 모르겠습니다.$
RS
RS
RS
-
-
\n-+\n
비슷한 접근 방식은 ^-+$
빈 줄을 바꾸고 Perl의 단락 모드를 사용하는 것입니다.
$ sed 's/--*/\n/' file | perl -F'\n' -00ane 'print "@F\n";'
49515 23/6/2014 SL B .OO 2500.00 R ROY 4561235 BEING THE T.E PAID
23495 26/7/2014 CL A 2300.00 .00 S DAS 2334167 BEING THE MONEY RECOVERED