나는 배우고있다 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