Awk: correspond à la chaîne exacte de la ligne

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

  • Pourquoi pensez-vous que votre code awk imprime un Avez-vous même pris la peine de comprendre ce que cela est censé faire?
  • Votre awk affichera i) le nombre de fois que vous avez vu ce premier champ où lavant-dernier champ est 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?

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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *