Utilisation de AWK pour filtrer la colonne avec des plages numériques

je suis relativement nouveau à BASH et j'essaie d'utiliser awk pour filtrer les données de la colonne 1 basée sur la 4ème colonne d'un fichier texte. Si la quatrième colonne de données correspond à la plage de x, alors elle produira les données de la colonne 1. "x" est supposé être une gamme de nombres 1-10 (1,2,3..10).

awk -F: '{ if(=="x") print }' filename.txt

filename.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20

utilisation:

awk -F: '{ if(=="1-10") print }' sample.txt
output = sample1, sample2, sample3, sample4

Il faut: sample1 sample2 une seule.

est-ce qu'il y a une erreur dans la syntaxe que je ne vois pas ou je pourrais peut-être utiliser cette syntaxe complètement de mal?

30
demandé sur udo 2012-01-05 01:32:13

6 réponses

awk '{ if ( >= 1 &&  <= 10) print  }' sample.txt
61
répondu Kambus 2012-01-04 21:54:23
awk ' ~ /^[1-9]$|^10$/{print }' sample.txt

sortie:

sample1
sample2

explication:

  • ^[1-9]$ --> $4 doit être un chiffre de 1 à 9
  • | (le tube) --> ou
  • ^10$ --> $4 doit être le numéro 10
13
répondu olibre 2017-04-14 17:37:32
awk -F ':' ' >= 1 &&  <= 10{print }'
4
répondu Gregory Patmore 2016-11-02 20:12:47

il peut y avoir un moyen de le faire en utilisant seulement awk (nevermind, voir mon édition ci-dessous), mais je n'en sais rien. Je le combinerais avec grep:

egrep ' ([1-9]|10)$' sample.txt | awk '{print }'

je pense que vous faites correspondre la quatrième colonne avec la chaîne de caractères "1-10" pas la gamme. Aussi,-F: modifiera le délimiteur en deux points au lieu d'un espace.

Edit:

awk ' ~ /^([1-9]|10)$/ {print }' sample.txt
2
répondu gpojd 2012-01-04 21:55:28

Si vous voulez awk pour rechercher des valeurs à partir d'une plage, vous pouvez définir cette plage dans le BEGIN déclaration.

awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ( in a){print }' sample.txt 

Test:

[jaypal:~/Temp] cat sample.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20
[jaypal:~/Temp] awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ( in a){print }' sample.txt 
sample1
sample2
1
répondu jaypal singh 2012-01-04 21:55:34

si Perl est une option, vous pouvez essayer cette solution similaire à la solution awk de Kambus:

perl -lane 'print $F[0] if $F[3] >= 1 && $F[3] <= 10' sample.txt

Ces options de ligne de commande sont utilisés:

  • -n boucle autour de chaque ligne du fichier d'entrée, ne pas imprimer automatiquement chaque ligne

  • -l supprime les nouvelles lignes avant traitement, et les ajoute de nouveau dans la suite

  • -a mode "autosplit" - séparer les lignes d'entrée dans le mode "@F" tableau.

  • -e exécutez le code perl

@F est le tableau de mots dans chaque ligne, indexé à partir de 0

1
répondu Chris Koknat 2015-09-15 18:54:16