2012-02-22 4 views
4

J'essaye de grep les lignes dans un fichier où le troisième champ correspond à certains critères. J'ai essayé d'utiliser grep mais je n'ai pas eu de chance de filtrer par un champ dans le fichier. J'ai un fichier complet des dossiers comme celui-ci:bash: grep uniquement les lignes avec certains critères

12794357382;0;219;215 
12795287063;0;220;215 
12795432063;0;215;220 

Je dois grep seulement les lignes où le troisième champ est égal à 215 (dans ce cas, seule la troisième ligne)

Merci beaucoup en avance pour votre aide!

Répondre

1

Simple egrep (= grep -E)

egrep ';215;[0-d][0-d][0-d]$' /path/to/file 

ou

egrep ';215;[[:digit:]]{3}$' /path/to/file 
+0

Quelle est la '0-d'? Savez-vous que le dernier champ sera toujours à trois chiffres? De quoi avez-vous besoin pour l'option '-E'? – tripleee

5

reposa le marteau.

$ awk -F ";" '$3 == 215 { print $0 }' <<< $'12794357382;0;219;215\n12795287063;0;220;215\n12795432063;0;215;220' 
12795432063;0;215;220 
+0

bien! Merci beaucoup!! Je ne savais pas que tu pouvais faire ça avec awk. impressionnant! – user1155413

+0

Le '{print $ 0}' est même superflue ici. Notez que cela gardera aussi des lignes comme 'abc; def; 0215; foo' – Benoit

+0

pourquoi' awk' serait préféré à 'grep'? Je n'ai jamais utilisé awk. D'une manière ou d'une autre, il semble toujours que * awk * ward ou _aw_ ful. Mais jamais _aw_ esome. –

2

grep:

grep -E "[^;]*;[^;]*;215;.*" yourFile 

dans ce cas, awk serait plus facile:

awk -F';' '$3==215' yourFile 
1

Que diriez-vous quelque chose comme ceci:

cat your_file | while read line; do 
    if [ `echo "$line" | cut -d ";" -f 3` == "215" ]; then 
     # This is the line you want 
    fi 
done 
+2

Bien que correct, mieux vaut ne pas cat et pipe et plutôt utiliser '<' redirection ('while read line; do ... done Benoit

+1

Le 'echo' peut également être supprimé en utilisant' cut ... <<< $ line'. Cependant, l'utilisation de 'cut' dans une boucle engendre beaucoup de processus, ce qui peut ralentir le traitement d'un gros fichier. – jfg956

1

Voici la version sed pour grep pour les lignes où le 3ème champ est 215:

sed -n '/^[^;]*;[^;]*;215;/p' file.txt 
1

Simplifiez votre problème en mettant le 3ème champ au début de la ligne:

cut -d ";" -f 3 file | paste -d ";" - file 

puis grep pour les lignes correspondant à la 3ème champ et retirez le 3ème champ au début:

grep "^215;" | cut -d ";" -f 2- 

puis vous pouvez grep pour tout ce que vous voulez. Donc, la solution complète est:

cut -d ";" -f 3 file | paste -d ";" - file | grep "^215;" | cut -d ";" -f 2- | grep _your_pattern_ 

Avantage: Facile à comprendre; Inconvénient: nombreux processus.

+0

+1 Recette cool qui peut être utile dans d'autres scénarios. Un autre inconvénient est que le fichier est lu deux fois - mais en parallèle, je suppose que le cache disque minimise l'impact. – leonbloy

2

Une solution dans bash pure pour le prétraitement, ont encore besoin d'un grep:

while read line; do 
    OLF_IFS=$IFS; IFS=";" 
    line_array=($line) 
    IFS=$OLD_IFS 
    test "${line_array[2]}" = 215 && echo "$line" 
done < file | grep _your_pattern_ 
Questions connexes