根据列中的值选择行

时间:2014-05-28 15:38:19

标签: bash awk

我有一个制表符分隔表,我想要打印列' 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%

3 个答案:

答案 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 > fileUUOC
  • 您的预期输出显示该值为80或以上的行。这个答案假定输出是你真正想要的,尽管缺乏处理它的代码。
  • 我没看到你最后一个输入示例与事物的关系。你输入的是否有特定的输出?

考虑:

$ 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