Awk: corrisponde alla stringa esatta nella riga

Ho questo file

a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z 

E io desidera far corrispondere la stringa esatta 200 utilizzando awk. Quindi il mio risultato dovrebbe essere

a deiauk Biking US 200 G 

Ecco il mio codice

awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt 

Ma dopo che ho ricevuto tutte le righe.

Commenti

  • Perché ti aspetti che il tuo codice awk stampi un una sola riga? Ti sei nemmeno preso la briga di capire cosa dovrebbe fare?
  • Il tuo awk stamperà i) il numero di volte che hai visto questo primo campo dove il penultimo campo è 200; ii) il primo campo e iii) il penultimo campo. Perché ti aspetteresti che stampi lintera riga? Che output stai effettivamente ottenendo?

Risposta

Dato che desideri una corrispondenza esatta, perché non utilizzare ==?

$ 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 

Puoi anche limitare la corrispondenza con /^200$/:

$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1 

Modifica:

Ho provato il tuo comando e dovrebbe funzionare. Sei sicuro della tua -F " "?

Comm ents

  • -F ' ' va bene nella mia ituazione. Non ' non so perché, ma ho ancora lo stesso problema

Risposta

Con awk, basta:

awk "$0~/ 200 /" file 

Oppure sed (\s corrisponde a qualsiasi spazio vuoto):

sed -n "/\s200\s/p" file 

A grep soluzione (-P per perl regex):

grep -P "\s200\s" file 

Se deve essere puro bash:

while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file 

Se “non sei sicuro che ci siano spazi, tabulazioni, qualunque cosa ([[:space:]] è come \s, nelle soluzioni sed e grep sopra ):

while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file 

Commenti

  • In grep funzionerà anche senza -P, grep '\s200\s' file

Risposta

Penso che questo s aiuterà. Questo stamperà solo la riga contenente il motivo. Nel tuo caso il pattern è 200

grep "200" file-name 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *