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
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
awk
stampi 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?