Tengo este archivo
a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z
Y yo desea hacer coincidir la cadena exacta 200 usando awk
. Entonces mi resultado debería ser
a deiauk Biking US 200 G
Aquí está mi código
awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt
Pero después que tengo todas las líneas.
Comentarios
Respuesta
Ya que desea una coincidencia exacta, ¿por qué no usar ==
?
$ cat >file a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z a auie auie 200 B b nrst nrst 200 C $ awk "$(NF-1)==200{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
También puede restringir su coincidencia con /^200$/
:
$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
Editar:
Probé tu comando y debería funcionar. ¿Estás seguro de tu -F " "
?
Comm ents
- Sí
-F ' '
está bien en mi ituaction. No ' no sé por qué, pero sigo teniendo el mismo problema
Responder
Con awk
, simplemente:
awk "$0~/ 200 /" file
O sed
(\s
coincide con cualquier espacio en blanco):
sed -n "/\s200\s/p" file
A grep
solución (-P
para perl regex):
grep -P "\s200\s" file
Si tiene que ser puro bash
:
while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file
Si «no está seguro de si hay espacios, pestañas, lo que sea ([[:space:]]
es como \s
, en las soluciones sed
y grep
anteriores ):
while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file
Comentarios
- En
grep
funcionará sin-P
también,grep '\s200\s' file
Respuesta
Creo que esto s ayudará. Esto imprimirá solo la línea que contiene el patrón. En su caso, el patrón es 200
grep "200" file-name
awk
imprima un ¿Una sola línea? ¿Se molestó siquiera en comprender lo que se supone que debe hacer?200
; ii) el primer campo y iii) el penúltimo campo. ¿Por qué esperaría que imprima la línea completa? ¿Qué resultado está obteniendo realmente?