如何在 AWK 脚本中指定要打印的行?
How do I specify a line to print in an AWK script?
我必须制作一个 awk 脚本来记录连续 3 天发生的事件,我有一个包含天数的列和一个包含月份的列,我正在测试它们以分析序列,但我不知道如何打印线条。这是我拥有的:
BEGIN{
count=0;
dia=0;
}
{
day=;
month=;
if(dia==31 && day==1 && month==02 || month==04 || month==06 || month==09 || month==11){
count+=1
}
else if(dia==30 && day==1 && month==03 || month==05 || month==07 || month==08 || month==10 || month==12){
count+=1
}
else if(dia==28 && day==1 && month==03){
count+=1
}
else if(day==dia+1){
count+=1;
}
else {
count=0;
}
if(count==3){
for(i=NR-4;i<=NR;i++){
print ??? (line i)
}
count=0;
}
dia=day;
}
我想用数组做一些东西,但我相信如果我能以这种方式打印它会更容易。
我的输入数据是这样的文件:
83032 18 07 0000 -99 20.4 -99 7.6 6.88
83032 27 08 0000 -99 30.6 -99 6.1 21
83037 29 06 0000 -99 20.4 -99 4.9 11.12
83037 30 06 0000 -99 18.7 -99 0.5 11.2
83037 01 07 0000 -99 33.5 -99 7.7 24
83037 05 07 0000 -99 23.3 -99 10.1 11.28
83037 17 07 0000 -99 21.1 -99 10.2 11.1
83037 18 07 0000 -99 20.7 -99 7.1 11.26
我只想取连续 3 天的行(第 2 列),输出如下:
83037 29 06 0000 -99 20.4 -99 4.9 11.12
83037 30 06 0000 -99 18.7 -99 0.5 11.2
83037 01 07 0000 -99 33.5 -99 7.7 24
也许您可以在此基础上进行构建。计算天数与前一天的比较,如果连续发生三个,则打印缓冲的行。请注意,这并不可靠,您可能还需要按第一个标识符字段进行分组,因为日期可能在一个组内有效。还需要考虑闰年。无论如何,对于给定的输入,这有效
BEGIN { # days in months
split("31,28,31,30,31,30,31,31,30,31,30,31", m, ",")
}
{
n = + 0 # calculate day num
for (i = 1; i < + 0; i++) {
n += m[i]
}
}
p + 1 == n { # if next value
c++ # increment counter
a[c] = [=10=] # save record
}
{ p = n } # set to previous
c == 3 { # print rows if reached target
for (i = 1; i <= c; i++) {
print a[i]
}
delete a # clear for next round
c = 0
}
我必须制作一个 awk 脚本来记录连续 3 天发生的事件,我有一个包含天数的列和一个包含月份的列,我正在测试它们以分析序列,但我不知道如何打印线条。这是我拥有的:
BEGIN{
count=0;
dia=0;
}
{
day=;
month=;
if(dia==31 && day==1 && month==02 || month==04 || month==06 || month==09 || month==11){
count+=1
}
else if(dia==30 && day==1 && month==03 || month==05 || month==07 || month==08 || month==10 || month==12){
count+=1
}
else if(dia==28 && day==1 && month==03){
count+=1
}
else if(day==dia+1){
count+=1;
}
else {
count=0;
}
if(count==3){
for(i=NR-4;i<=NR;i++){
print ??? (line i)
}
count=0;
}
dia=day;
}
我想用数组做一些东西,但我相信如果我能以这种方式打印它会更容易。
我的输入数据是这样的文件:
83032 18 07 0000 -99 20.4 -99 7.6 6.88
83032 27 08 0000 -99 30.6 -99 6.1 21
83037 29 06 0000 -99 20.4 -99 4.9 11.12
83037 30 06 0000 -99 18.7 -99 0.5 11.2
83037 01 07 0000 -99 33.5 -99 7.7 24
83037 05 07 0000 -99 23.3 -99 10.1 11.28
83037 17 07 0000 -99 21.1 -99 10.2 11.1
83037 18 07 0000 -99 20.7 -99 7.1 11.26
我只想取连续 3 天的行(第 2 列),输出如下:
83037 29 06 0000 -99 20.4 -99 4.9 11.12
83037 30 06 0000 -99 18.7 -99 0.5 11.2
83037 01 07 0000 -99 33.5 -99 7.7 24
也许您可以在此基础上进行构建。计算天数与前一天的比较,如果连续发生三个,则打印缓冲的行。请注意,这并不可靠,您可能还需要按第一个标识符字段进行分组,因为日期可能在一个组内有效。还需要考虑闰年。无论如何,对于给定的输入,这有效
BEGIN { # days in months
split("31,28,31,30,31,30,31,31,30,31,30,31", m, ",")
}
{
n = + 0 # calculate day num
for (i = 1; i < + 0; i++) {
n += m[i]
}
}
p + 1 == n { # if next value
c++ # increment counter
a[c] = [=10=] # save record
}
{ p = n } # set to previous
c == 3 { # print rows if reached target
for (i = 1; i <= c; i++) {
print a[i]
}
delete a # clear for next round
c = 0
}