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?
6 réponses
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
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
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
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