awk 질문 - 고유한 날짜에 대해서만 추가 행을 인쇄하는 방법

awk 질문 - 고유한 날짜에 대해서만 추가 행을 인쇄하는 방법

저는 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 /
/

관련 정보