저는 AWK를 처음 접했고 다른 프로그램에 대한 입력을 준비하기 위해 AWK를 사용하려고 합니다. 아래 표와 같은 데이터가 있는데 5열부터 10열까지 데이터를 추출해야 합니다. 또한 (1열과 2-4열에 설명된 대로) 새로운 날짜가 나올 때마다 이전 명령( )을 작성해야 합니다. DATES
아래 "원하는 출력"을 참조하세요.
입력 예 (
input.txt
) -설명의 첫 번째 줄은 설명을 위한 것일 뿐 실제 데이터에는 나타나지 않습니다.# 1 2 3 4 5 6 7 8 9 10 20071016 16 Oct 2007 A X1 X2 X3 X4 X5 20071017 17 Oct 2007 A X1 X2 X3 X4 X5 20071017 17 Oct 2007 B X1 X2 X3 X4 X5 20071018 18 Oct 2007 C X1 X2 X3 X4 X5
예상 출력(
out.txt
)DATES 16 Oct 2007 / / WCONPROD A X1 X2 X3 X3 X4 X5 / / DATES 17 Oct 2007 / / WCONPROD A X1 X2 X3 X3 X4 X5 / / WCONPROD B X1 X2 X3 X3 X4 X5 / / DATES 18 Oct 2007 / / WCONPROD C X1 X2 X3 X3 X4 X5 / /
DATES
내가 겪고 있는 문제는 동일한 날짜의 행이 여러 개 있는 경우 각 날짜가 한 번만 인쇄된다는 것입니다. 이를 달성하기 위해 다음 AWK 줄을 찾아 수정했지만 각 (새) 날짜에 대해 한 번만 날짜를 제공하는 데 문제가 있습니다. 다른 열을 만들었고 AWK에서 첫 번째 열을 이전 열과 찾거나 비교하려고 시도하고 있지만 이를 달성하는 방법을 잘 모르겠습니다.
awk
명령이 시도되었습니다{ printf "%-s\n%-s %s %s %s\n%s\n", "DATES", $2,$3,$4,"/","/" print "\nWCONPROD\n" printf " %-s \t%s %s %s %s %s %s %s\n%s\n\n", $5, $6, $7, $8, $8, $9, $10, "/","/" }
- 이러한 AWK 명령을 실행하면
DATES
다음과 같이 각 줄을 인쇄합니다.DATES 16 Oct 2007 / / WCONPROD A X1 X2 X3 X3 X4 X5 / / DATES 17 Oct 2007 / / WCONPROD A X1 X2 X3 X3 X4 X5 / / ## i want to remove (not to print) these/next 3 lines as this date was already declared earlier DATES 17 Oct 2007 / / WCONPROD B X1 X2 X3 X3 X4 X5 / / DATES 18 Oct 2007 / / WCONPROD C X1 X2 X3 X3 X4 X5 / /
답변1
다음 awk
프로그램은 이 문제를 해결해야 합니다.
awk '$1!=lastdate {printf "DATES\n%s %s %s /\n/\n",$2,$3,$4; lastdate=$1}
{print "WCONPROD"; for (i=5;i<=NF;i++) printf "%s%s",$i,OFS; print "/\n/"}' input.txt
첫 번째 열의 값을 변수의 내용과 비교하고 lastdate
, 다를 경우 지정된 "헤더" 부분을 인쇄합니다. 또한 lastdate
온라인에서 발견된 새로운 날짜로 업데이트됩니다 .
WCONPROD
모든 줄에 대해 문자열을 인쇄한 다음 "출력 필드 구분 기호"로 구분된 필드 5부터(필드 수에 관계없이)를 인쇄합니다 (기본값은 단일 공백이며 -v OFS='whatever'
명령줄 인수에 따라 변경될 수 있음). need) 를 입력한 다음 / <newline> /
패턴을 전달합니다.
귀하의 예 출력 :
DATES
16 Oct 2007 /
/
WCONPROD
A X1 X2 X3 X4 X5 /
/
DATES
17 Oct 2007 /
/
WCONPROD
A X1 X2 X3 X4 X5 /
/
WCONPROD
B X1 X2 X3 X4 X5 /
/
DATES
18 Oct 2007 /
/
WCONPROD
C X1 X2 X3 X4 X5 /
/