使用AWK过滤掉具有数字范围的列

时间:2012-01-04 21:32:14

标签: bash numbers awk range

我对BASH比较新,我正在尝试使用awk根据文本文件的第4列过滤掉第1列数据。如果第4列数据与x的范围匹配,那么它将输出第1列数据。 “x”被认为是1-10(1,2,3..10)的数字范围。

awk -F: '{ if($4=="x") print $1}' filename.txt

filename.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20

实际使用:

awk -F: '{ if($4=="1-10") print $1}' sample.txt
output = sample1, sample2, sample3, sample4

应该只有:sample1 sample2

我没有看到语法错误,或者我可能完全错误地使用这种语法?

6 个答案:

答案 0 :(得分:64)

awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt

答案 1 :(得分:14)

awk '$4 ~ /^[1-9]$|^10$/{print $1}' sample.txt

输出:

sample1
sample2

说明:

  • ^[1-9]$ - &gt; $ 4必须是1到9之间的单个数字
  • |(管道) - &gt;或
  • ^10$ - &gt; $ 4必须是数字10

答案 2 :(得分:4)

awk -F ':' '$4 >= 1 && $4 <= 10{print $1}'

答案 3 :(得分:2)

可能有一种方法只使用awk(没关系,请参阅下面的编辑),但我不知道。我将它与grep:

结合起来
egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'

我认为你匹配第四列的字符串“1-10”而不是范围。此外,-F:会将分隔符更改为冒号而不是空格。

编辑:

awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt

答案 4 :(得分:1)

如果您希望awk查找某个范围内的值,则可以在BEGIN语句中设置该范围。

awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 

测试:

[jaypal:~/Temp] cat sample.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20
[jaypal:~/Temp] awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 
sample1
sample2

答案 5 :(得分:1)

如果Perl是一个选项,你可以试试这个类似于Kambus的awk解决方案的解决方案:

perl -lane 'print $F[0] if $F[3] >= 1 && $F[3] <= 10' sample.txt

使用以下命令行选项:

  • -n循环输入文件的每一行,不自动打印每一行

  • -l在处理之前删除换行符,然后将其添加回来

  • -a autosplit模式 - 将输入行拆分为@F数组。

  • -e执行perl代码

@F是每行中的单词数组,从0开始索引