awk: 명령에 정의된 변수에서 이름이 유래된 파일로 인쇄

awk: 명령에 정의된 변수에서 이름이 유래된 파일로 인쇄

나는 배우고있다 awk. 내 문제에 대한 해결책을 찾으려고 노력하는 동안 다음 코드를 찾았지만 끝에 멈췄습니다 1. 설명하다:

내용 file:

H|20200425|abcd|    # header
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
  • 마지막에 추가

    T|20200425|-count of records-|-sum of 4th column-
    
  • 20190306.txt출력을 YYYYMMDD 형식의 세 번째 열에 있는 날짜인 파일로 보냅니다 .

내 시도:

awk -F'|' '
  # get the date formatted
  NR == 2 { 
    d = $3; gsub(/-/,"",d) 
  } 
  # get the 2nd field of the header
  NR == 1 { 
    a = $2 
  } 
  # if the line starts with 'R', sum the column and get the count of them
  $1 == "R" { 
    sum += $4
    ++c 
  } 
  # print the final line with variables acquired
  END { 
    OFS = "|"; print "T",a,c,sum".00" 
  }1
' file

이 명령은 "예상" 결과를 제공합니다.

H|20200425|abcd|    
R|abc|2019-03-06|100.00
R|abc|2019-03-06|15.00
R|abc|2019-03-06|10.00
T|20200425|3|125.00

변수 d는 입니다 20190306.

하지만 제가 묻고 있는 질문은 이 출력을 file 로 리디렉션하는 방법입니다 20190306.txt.


``물론 이것은 잘못된 코딩입니다.(한숨을 쉬다, Brainache), 그러나 내 목표는 가능한 한 문제에 집중하는 것이며 모든 버그를 지적하도록 요구하는 것은 아닙니다.

답변1

암시적 인쇄 작업( mode 에 의해 트리거됨 )을 명시적 인쇄 작업으로 d대체하여 이름이 awk 변수에 저장된 파일에 레코드를 인쇄할 수 있습니다 .1{print > d}

d까다로운 점은 두 번째 레코드가 처리될 때까지 값을 알 수 없으므로 그때까지 헤더 레코드를 저장해야 한다는 것입니다.

예를 들어:

$ awk -F'|' '
  # get the 2nd field of the header
  NR == 1 { 
    a = $2 
    h = $0
    next
  } 
  # get the date formatted
  NR == 2 { 
    d = $3; gsub(/-/,"",d) 
    print h > d
  } 
  # if the line starts with 'R', sum the column and get the count of them
  $1 == "R" { 
    sum += $4
    ++c 
  } 
  {
    print > d
  }
  # print the final line with variables acquired
  END { 
    OFS = "|"; print "T",a,c,sum".00" > d
  }
' file

관련 정보