/ / awk excluye entradas que no satisfacen múltiples condiciones pero satisfacen otras: linux, bash, if-instrucción, awk, condición

awk excluye las entradas que no satisfacen múltiples condiciones pero satisfacen otras: linux, bash, if-statement, awk, condition

estoy tratando de incluir valores en mis datos que tienen:

  1. la segunda columna más pequeña que 1;

y excluir las entradas con:

  1. la primera columna igual a 3 y
  2. la cuarta columna más grande que 25
  3. la cuarta columna más pequeña que 35

Básicamente, excluyendo las entradas que se encuentran entre el rango de 25 y 35 para la columna 4 y $ 1 == 3. ¿Hay una manera simple de hacer esto sin complicarse demasiado?

Algo como:

awk "{OFS="t"} {if (($2 < 1) & !($1==3 && $4>25 && $4<35)) print $0}" file.txt

Respuestas

2 para la respuesta № 1

Superficialmente, esto debería hacer:

awk "BEGIN {OFS="t"} {if (($2 < 1) && !($1==3 && $4>25 && $4<35)) print $0}" file.txt

como lo haría:

awk "BEGIN {OFS="t"} (($2 < 1) && !($1==3 && $4>25 && $4<35)) { print $0 }" file.txt

que podría reducirse aún más a:

awk "BEGIN {OFS="t"} (($2 < 1) && !($1==3 && $4>25 && $4<35)) { print }" file.txt

o:

awk "BEGIN {OFS="t"} (($2 < 1) && !($1==3 && $4>25 && $4<35))" file.txt

Los cambios principales son usar un bloque BEGIN para establecer OFS una vez, y para usar && para combinar el ($1 < 1) condición con la condición de exclusión. El soltero & es una operación bit a bit, y aunque los valores de los dos términos deben ser 0 o 1 y la lógica bit a bit debería funcionar, ciertamente no es la forma normal de tratarlo.

En realidad, dado que simplemente está imprimiendo el registro de entrada sin cambios, incluso podría perder el BEGIN bloquear y usar:

awk "(($2 < 1) && !($1==3 && $4>25 && $4<35))" file.txt

Si la entrada tiene pestañas que separan los campos, estos estarán presentes en la salida.

Todos estos scripts toman exactamente lo que dijiste en la lista de viñetas, pero tu texto dice "excluyendo las entradas que se encuentran entre el rango de 25 y 35 para la columna 4" y eso a menudo se interpretaría como rechazar los valores 25 y 35 (así como 26..34), pero no es lo que dice la lista de viñetas o lo que implementa el código. La solución es, por supuesto, trivial (>= y <= en lugar de > y <)

No proporcionó ningún dato de prueba y salida esperada. Por favor, intente hacerlo. Aquí hay un generador de datos de código de prueba simple (que proporciona 54 líneas de salida):

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 "%st%st%st%sn" $h $i blather $j
done
done
done

Cuando se ejecuta y el resultado se pasa al script que se muestra, el resultado es:

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

Eso parece ser correcto.