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