我有一个制表符分隔表,我想要打印列' x'大于' Y'。我曾尝试使用下面的代码,但我是使用awk的新手,所以我不确定如何根据列使用它。
awk '$X >= Y {print} ' Table.txt | cat > Wanted_lines
Y是1到100之间的值。
如果输入如下,列X是第二列。
1 30
2 50
3 100
4 100
5 80
6 79
7 90
想要的输出是:
3 100
4 100
5 80
7 90
该文件的前两行是:
1 OTU1 243622 208679 121420 265864 0 0 2 0 0 11 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 839604 OTU1 - Archaea 100% Euryarchaeota 100% Methanobacteria 100% Methanobacteriales 100% Methanobacteriaceae 100% Methanobrevibacter 100%
2 OTU2 84366 120817 15834 74737 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 295755 OTU2 - Archaea 100% Euryarchaeota 100% Methanobacteria 100% Methanobacteriales 100% Methanobacteriaceae 100% Methanobrevibacter 100%
答案 0 :(得分:4)
<强>第一强>
awk的默认内部字段分隔符(FS)将适用于空格或制表符分隔文件。
<强>其次强>
awk '$x > FLOOR' Table.txt
$x
是目标列,FLOOR
是实际数字楼层(即5000等)
示例文件:awktest
500 100
400 1100
1000 400
1200 500
awk '$1 > 1000' awktest
1200 500
awk '$1 >= 1000' awktest
1000 400
1200 500
因此,您应该能够使用关系表达式来打印x> gt的行。 y,形式为:
awk '$x > $y' awktest
其中$x
是$1
中的数字列,或其他。
其中$y
是$2
中的数字列,或其他。
示例强>:
awk '$1 > $2' awktest
或......
awk '$2 > $1' awktest
awk数字是浮点数,所以你也可以比较小数。
答案 1 :(得分:0)
尝试:
awk -v num_col=$X -v limit=$Y '$num_col + 0 >= limit + 0' Table.txt > Wanted_lines
示例:
$ cat Table.txt
1 30
2 50
3 100
4 100
5 80
6 79
7 90
$ X=2
$ Y=80
$ awk -v num_col=$X -v limit=$Y '$num_col + 0 > limit + 0' Table.txt
3 100
4 100
5 80
7 90
另外(hacky和不推荐)awk的外壳可以这样打破:
$ awk '$'"${X}"' + 0 >= '"${Y}"' + 0' Table.txt
这是您在实际文件中删除%符号所需的内容:
$ awk -v num_col=43 -v limit=80 '{sub(/%/,"",$num_col)}$num_col + 0 >= limit + 0 ' Table.txt
答案 2 :(得分:0)
因此...
'$X >= Y {print}'
是多余的,因为awk中的默认操作是打印。| cat > file
是UUOC。考虑:
$ awk '$X >= Y' X=2 Y=80 input.txt
3 100
4 100
5 80
7 90
$ awk '$X >= Y' X=2 Y=90 input.txt
3 100
4 100
7 90
上述符号依赖于man awk
中的以下声明:
任何形式为var = value的文件 被视为赋值,而不是文件名,并在 如果它是文件名,它将被打开的时间。
这在功能上等同于:
$ awk -v X=2 -v Y=80 '$X >= Y' input.txt
将shell变量放入awk脚本的这些符号中的任何一个都可以正常使用,我相信你遇到的任何awk版本(bsdawk,gawk,mawk)都应该同样处理好。
在shell脚本中,您可能会看到如下内容:
#!/usr/bin/env bash
if [[ $# != 2 ]]; then
printf 'Please supply column and floor values as parameters.\n'
exit 1
elif [[ $1 =~ [^0-9] ]] || [[ $2 =~ [^0-9] ]]; then
printf 'Invalid parameters.\n'
exit 1
fi
awk '$X >= Y' X="$1" Y="$2" input.txt