필드 및 레코드 구분 기호를 수정하여 awk를 사용하여 구문 분석

필드 및 레코드 구분 기호를 수정하여 awk를 사용하여 구문 분석

다음과 같은 파일이 있습니다.

------------------------------------------------------------------------------------------------------------------------------------------------------------------
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 를 사용했다는 것입니다. 정규식이 내부적으로 어떻게 구현되는지 잘 모르겠지만 실제로는 줄이 아닌 파일의 시작과 끝을 참조하는 것 같습니다. 해결 방법으로 줄 바꿈 끝을 설정했습니다. 그러나 이는 줄 끝에 하나 이상이 있을 수 있으면 끊어진다는 것을 의미합니다. 첫 번째 줄이 실패해서 처음부터 어떻게 맞춰야 할지 모르겠습니다.$RSRSRS--\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 

관련 정보