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
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
- Sì
-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
grepfunzionerà 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
awkstampi un una sola riga? Ti sei nemmeno preso la briga di capire cosa dovrebbe fare?200; ii) il primo campo e iii) il penultimo campo. Perché ti aspetteresti che stampi lintera riga? Che output stai effettivamente ottenendo?