awk를 사용하여 파일을 반복하는 방법

awk를 사용하여 파일을 반복하는 방법

ksh 스크립트에서 이 명령을 사용하여 sed -e '/^*/d' $WORKFILE | awk -f test.awk >> $OUTPUTFILE 아래와 같이 274567줄의 파일을 가져옵니다.

*
*
*
*
*
 syopsf00
         a0000096
                 782            1
         CAStmtInv
 syopsf00
         a0000096
                 782            1
         USStmtInv
 syopsf00
         a0000096
                 606            1
         CAStmtInv
 syopsf00
         a0000096
                 606            1
         USStmtInv
 syopsf00
         a0000096
               23472            4
         AO
 syopsf00
         a0000096
               23472            4
         Dealer
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

다음 줄을 포함하는 파일을 생성합니다.

syopsf00 a0000096 782 1 CAStmtInv
syopsf00 a0000096 782 1 USStmtInv
syopsf00 a0000096 606 1 CAStmtInv
syopsf00 a0000096 606 1 USStmtInv

하지만 내가 얻는 건

syopsf00 a0000096 782 1 CAStmtInv

awk 스크립트(test.awk)는 다음과 같습니다.

BEGIN {
         RS="\n\n";
         FS=" ";

}
END {
         print $1,$2,$3,$4,$5;
}

답변1

정확히 무엇을 하려고 하는지 (입력에 따라) 완전히 명확하지는 않지만 출력의 문제는 END 문에 인쇄를 넣기 때문에 awk에 공급된 마지막 줄만 인쇄된다는 것입니다.

다음과 같아야 합니다.

BEGIN { 
  RS="\n\n"; FS=" ";
}
{ 
  print $1,$2,$3,$4,$5; 
}

참고: 들여쓰기는 제 개인적인 취향입니다.

답변2

awk밑창이면 충분할 것 같아요

awk '
     /syopsf00/{print ""}
     !/^[*]/{printf "%s",$0}
     END{print ""}
    ' $WORKFILE >> $OUTPUTFILE

또는 여러 공백을 제거하고 awk-scriptfile을 사용하려는 경우:

awk -f test.awk "$WORKFILE" >> "$OUTPUTFILE"

어디 test.awk:

#!/usr/bin/awk -f
/syopsf00/{print ""}
!/^[*]/{printf ("%s",$1" "$2" "}
END{print ""}

답변3

순수 sed단일 라인:

sed ':X;N;s/*//;$!bX;s/\n  /\t/g;:Y;s/\n\n//g;tY' $WORKFILE

처음에는 상당히 복잡해 보일 수 있지만 기본적으로 모든 *, 모든 줄 바꿈, 두 개의 공백( '\n '), 마지막으로 이중 줄 바꿈을 \n\n제거하여 정리합니다. 이 표현은 아마도 단순화될 수 있을 것입니다.

열을 더 잘 정렬하기 위해 필드 구분 기호로 공백 대신 탭을 사용하고 있습니다 \t. 출력은 다음과 같습니다.

 syopsf00          a0000096                782            1        CAStmtInv
 syopsf00          a0000096                782            1        USStmtInv
 syopsf00          a0000096                606            1        CAStmtInv
 syopsf00          a0000096                606            1        USStmtInv
 syopsf00          a0000096              23472            4        AO
 syopsf00          a0000096              23472            4        Dealer

관련 정보