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

Bur*_*135 31 bash awk numbers 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
Run Code Online (Sandbox Code Playgroud)

实际使用:

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

应该是:sample1 sample2只有.

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

Kam*_*bus 64

awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用表达式作为模式并取消`if`,如下所示:`awk'$ 4 <= 10 && $ 4> = 1 {print $ 1}'file.txt` (14认同)
  • 另外,'awk'1 <= $ 4 && $ 4 <= 10'meample.txt`对于像我这样希望根据一列的值输出整行的人来说非常有用. (3认同)

oli*_*bre 14

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

输出:

sample1
sample2
Run Code Online (Sandbox Code Playgroud)

说明:

  • ^[1-9]$ - > $ 4必须是从1到9的单个数字
  • | (管道) - >或
  • ^10$ - > $ 4必须是数字10


Gre*_*ore 6

awk -F ':' '$4 >= 1 && $4 <= 10{print $1}'
Run Code Online (Sandbox Code Playgroud)


gpo*_*ojd 4

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

egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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