我尝试使用awk
来选择第三列中值大于98的所有行。在输出中,只有98 -98.99之间的行...被选中,值大于98.99的行未被选中。
我想提取所有值大于98的行,包括99、100等等。
下面是我的代码和输入格式:
for i in *input.file; do awk '$3>98' $i >{i/input./output.}; done
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
预期输出
A chr11 98.80 83 1 0 2 84
D chr6 100.00 20 0 0 1 20
发布于 2020-06-23 15:33:51
好的,如果您有一系列的文件,*input.file
,并且您想要选择那些包含$3 > 98
的行,然后将这些值写到相同的前缀,但是使用output.file
作为文件名的其余部分,您可以使用:
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。
例如,如果您有输入文件:
$ ls -1 *input.file
v1input.file
v2input.file
两者都包含您的示例内容:
$ 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
命令将产生两个输出文件:
$ ls -1 *output.file
v1output.file
v2output.file
包含第三个字段大于98
的记录
$ cat v1output.file
A chr11 98.80 83 1 0 2 84
D chr6 100.00 20 0 0 1 20
https://stackoverflow.com/questions/62529021
复制相似问题