我在我的数据中尝试包含值:
和排除条目:
基本上,排除第4列和$ 1 = = 3之间介于25和35范围之间的条目。是否有一种简单的方法可以做到这一点而不会太复杂?
类似的东西:
awk '{OFS="\t"} {if (($2 < 1) & !($1==3 && $4>25 && $4<35)) print $0}' file.txt
答案 0 :(得分:2)
表面上看,这应该做到:
awk 'BEGIN {OFS="\t"} {if (($2 < 1) && !($1==3 && $4>25 && $4<35)) print $0}' file.txt
就像:
awk 'BEGIN {OFS="\t"} (($2 < 1) && !($1==3 && $4>25 && $4<35)) { print $0 }' file.txt
可以进一步简化为:
awk 'BEGIN {OFS="\t"} (($2 < 1) && !($1==3 && $4>25 && $4<35)) { print }' file.txt
或:
awk 'BEGIN {OFS="\t"} (($2 < 1) && !($1==3 && $4>25 && $4<35))' file.txt
主要更改是使用BEGIN块设置OFS
一次,并使用&&
将($1 < 1)
条件与排除条件相结合。单&
是一个按位运算,虽然两个项的值应该是0或1,并且按位逻辑应该有效,但它肯定不是处理它的正常方法。
实际上,由于您只是简单地打印输入记录,您甚至可能会丢失BEGIN
块并使用:
awk '(($2 < 1) && !($1==3 && $4>25 && $4<35))' file.txt
如果输入中有用于分隔字段的选项卡,那么这些字段将出现在输出中。
这些脚本完全按照您在项目符号列表中所述的内容进行操作,但是您的文字显示&#39;排除了第4列&#39; 之间介于25和35之间的条目这通常被解释为拒绝值25和35(以及26..34),但它不是子弹列表所说的或代码实现的。当然,修复是微不足道的(>=
和<=
代替>
和<
)。
您没有提供任何测试数据和预期输出 - 请以此为目标。这是一个简单的测试代码数据生成器(提供54行输出):
for h in 2 3 4
do
for i in -1 0 1
do
for j in 24 25 26 34 35 36
do
printf "%s\t%s\t%s\t%s\n" $h $i blather $j
done
done
done
运行并将输出传递给显示的脚本时,输出为:
2 -1 blather 24
2 -1 blather 25
2 -1 blather 26
2 -1 blather 34
2 -1 blather 35
2 -1 blather 36
2 0 blather 24
2 0 blather 25
2 0 blather 26
2 0 blather 34
2 0 blather 35
2 0 blather 36
3 -1 blather 24
3 -1 blather 25
3 -1 blather 35
3 -1 blather 36
3 0 blather 24
3 0 blather 25
3 0 blather 35
3 0 blather 36
4 -1 blather 24
4 -1 blather 25
4 -1 blather 26
4 -1 blather 34
4 -1 blather 35
4 -1 blather 36
4 0 blather 24
4 0 blather 25
4 0 blather 26
4 0 blather 34
4 0 blather 35
4 0 blather 36
这似乎是正确的。