Jai ce fichier
a deiauk Biking US 200 G b kespaul 202 A c deiauk NY 222 5 Z
Et je voulez faire correspondre la chaîne exacte 200 en utilisant awk
. Donc, mon résultat devrait être
a deiauk Biking US 200 G
Voici mon code
awk -F " " "{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}" file.txt
Mais après que jai toutes les lignes.
Commentaires
Réponse
Puisque vous voulez une correspondance exacte, pourquoi ne pas utiliser ==
?
$ 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
Vous pouvez également restreindre votre correspondance avec /^200$/
:
$ awk "$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print v,a[v]}}" file a 2 b 1
Edit:
Jai essayé votre commande, et ça devrait marcher. Êtes-vous sûr de votre -F " "
?
Comm ents
- Oui
-F ' '
est très bien dans mon action. Je ' ne sais pas pourquoi mais jai toujours le même problème
Réponse
Avec awk
, il suffit de:
awk "$0~/ 200 /" file
Ou sed
(\s
correspond à nimporte quel espace):
sed -n "/\s200\s/p" file
A grep
solution (-P
pour perl regex):
grep -P "\s200\s" file
Si elle doit être pure bash
:
while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file
Si vous « nêtes pas sûr quil y ait des espaces, des tabulations, peu importe ([[:space:]]
est similaire à \s
, dans les solutions sed
et grep
ci-dessus ):
while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file
Commentaires
- In
grep
cela fonctionnera sans-P
également,grep '\s200\s' file
Réponse
Je pense que s aidera. Cela nimprimera que la ligne contenant le motif. Dans votre cas, le modèle est 200
grep "200" file-name
awk
imprime un Avez-vous même pris la peine de comprendre ce que cela est censé faire?200
; ii) le premier champ et iii) lavant-dernier champ. Pourquoi vous attendez-vous à ce quil imprime la ligne entière? Quel résultat obtenez-vous réellement?