0

我有一个文件,它有一个这样的重复模式,总共大约 30000 行:

K     102940
-1.34869738    20.57483945   -50.68597047
23.77974649   -24.07345423    15.78597590
---
K     102942
-1.34869738    20.57483945   -50.68597047
23.77974649   -24.07345423    15.78597590
---

我需要检查第二行的第三个字段,如果它在 -20 和 +20 的范围内,那么我只想打印后面的行(上例中的第三行)。如果该值不在范围内(如上),我想检查第 2+100 行(忽略中间的一行)。继承人我到目前为止:

awk -v l=2 -v d=100 'NR==l'; 'if ($3 =={-20..20}); {getline;print;exit}; else (l+=d) next; fi' inputfile

但错误'-bash: if ... next: command not found

有人对如何改进代码有任何想法吗?或者也许是处理这个文件的更好方法?

非常感谢任何帮助。谢谢!

4

1 回答 1

1

该脚本应该为您提供一个良好的开端:

print_flag {                  # if the print flag is set print the line
    print $0
    exit                      # exit the script as the match was printed
}
block_flag {                  # if the block_flag is set check if the value of
    if ($3 > -20 && $3 < 20)  # $3 is in range and set the print_flag
        print_flag = 1                      
    block_flag = 0            # unset the block_flag
}
$1=="K" {                     # if the line starts with a single k
    block_flag = 1            # we are in a new block: set a flag
}

将其保存到文件中script.awk并运行如下:

$ awk -f script.awk file

如果第二行的第三个值在范围内,这将打印任何块的第三行。我在这里假设每个新块都以K第一个字段中的单个开头。

于 2013-08-06T12:08:55.797 回答