发布
社区首页 >问答首页 >使用awk选择列中特定值大于x的行

使用awk选择列中特定值大于x的行
EN

Stack Overflow用户
提问于 2020-06-23 14:59:23
回答 1查看 345关注 0票数 0

我尝试使用awk来选择第三列中值大于98的所有行。在输出中,只有98 -98.99之间的行...被选中,值大于98.99的行未被选中。

我想提取所有值大于98的行,包括99、100等等。

下面是我的代码和输入格式:

for i in *input.file; do awk '$3>98' $i >{i/input./output.}; done

代码语言:javascript
代码运行次数:0
复制
A   chr11   98.80   83  1   0   2   84

B   chr7    95.45   22  1   0   40  61

C   chr7    88.89   27  0   1   46  72

D   chr6    100.00  20  0   0   1   20

预期输出

代码语言:javascript
代码运行次数:0
复制
A   chr11   98.80   83  1   0   2   84

D   chr6    100.00  20  0   0   1   20
EN

Stack Overflow用户

回答已采纳

发布于 2020-06-23 15:33:51

好的,如果您有一系列的文件,*input.file,并且您想要选择那些包含$3 > 98的行,然后将这些值写到相同的前缀,但是使用output.file作为文件名的其余部分,您可以使用:

代码语言:javascript
代码运行次数:0
复制
awk '$3 > 98 {
    match (FILENAME,/input.file$/)
    print $0 > substr(FILENAME,1,RSTART-1) "output.file"
}' *input.file

它使用match查找input.file开头的索引,然后使用substr获取该索引之前的文件名部分,并将"output.file"附加到最终输出文件名的子字符串。

match()RSTART值设置为当前文件名中input.file开头的索引,然后substr使用该索引截断该索引处的当前文件名。有关完整的详细信息,请参阅GNU awk String Functions

例如,如果您有输入文件:

代码语言:javascript
代码运行次数:0
复制
$ ls -1 *input.file
v1input.file
v2input.file

两者都包含您的示例内容:

代码语言:javascript
代码运行次数:0
复制
$ cat v1input.file
A chr11 98.80 83 1 0 2 84

B chr7 95.45 22 1 0 40 61

C chr7 88.89 27 0 1 46 72

D chr6 100.00 20 0 0 1 20

运行上面的awk命令将产生两个输出文件:

代码语言:javascript
代码运行次数:0
复制
$ ls -1 *output.file
v1output.file
v2output.file

包含第三个字段大于98的记录

代码语言:javascript
代码运行次数:0
复制
$ cat v1output.file
A chr11 98.80 83 1 0 2 84
D chr6 100.00 20 0 0 1 20
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62529021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档