estoy tratando de incluir valores en mis datos que tienen:
- la segunda columna más pequeña que 1;
y excluir las entradas con:
- la primera columna igual a 3 y
- la cuarta columna más grande que 25
- 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 № 1Superficialmente, 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.