我对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
。
我没有看到语法错误,或者我可能完全错误地使用这种语法?
答案 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开始索引