Extraction de lignes en fonction des conditions

Chaque ligne d'un file séparé par des virgules comporte 5 champs.

a,b,c,d,e f,g,c,i, j,k,c,m,n o,p,c,r,s t,u,c,w, x,y,z,aa,bb 

Comment puis-je extraire les lignes qui ont c dans le 3ème champ et leur 5ème champ n'est PAS vide? Le résultat serait:

 a,b,c,d,e j,k,c,m,n o,p,c,r,s 

Solution possible avec awk :

 awk -F',' '$3 == "c" && $5' file 

En fonction des données réelles, cela peut ne pas fonctionner comme souhaité dans les commentaires (merci Janis pour avoir signalé ceci: il manquera f,g,c,i,0 par exemple 5e champ est 0)

 awk -F',' '$3 == "c" && $5 != ""' file 

Et comme c'est la réponse acceptée, je rajoute pas forcément si évident de forcer le 5ème champ à la string (comme dans la solution cuonglm (+1)):

 awk -F',' '$3 == "c" && $5""' file 
 sed -n '/,$/!s/^\([^,]*,\)\{2\}c/&/p' 

… travaillera pour un POSIX sed . Si vous pouvez utiliser un sed qui implémente les expressions régulières AT & T Augmented – telles que celle disponible gratuitement dans le package astopen – vous pouvez le faire comme:

 sed -nX '/^(([^,]*,){2}c.*)&(.*,)!$/p' 

Bien sûr, si le dernier cas est vrai, vous avez probablement un grep similaire (qui peut être compilé comme un ksh93 builtin, d'ailleurs) et donc vous devriez probablement faire à la place:

 grep -xX '(([^,]*,){2}c.*)&(.*,)!' 

Avec awk :

 awk -F, '$3 == "c" && $5""' file 

Dans awk , 0 et "" sont deux fausses valeurs dans le context boolean. Donc, si vous faites quelque chose comme $3 == "c" && $5 , vous manquerez les lignes dont le cinquième champ est 0 . $5"" force awk contraint le cinquième champ à la string, la string "0" sera évaluée à vrai.

Ce n'est pas aussi court que certaines réponses, mais c'est la seule réponse qui programme exactement ce qui est demandé:

 awk '$3 == "c" && $5 != ""' FS=, 

Avec perl, vous pourriez faire quelque chose comme:

 perl -F, -nlae 'print if $F[2] eq "c" and $F[4] ne ""' 

L'option -a divise les lignes par le délimiteur spécifié par l'option -F et vous pouvez ensuite simplement vérifier les champs dans le tableau @F .

En utilisant python :

 #!/usr/bin/env python2 with open('file.txt') as f: for line in f: fields = line.rssortingp().split(',') if fields[2] == 'c' and fields[4]: print line.rssortingp() 

Ici, nous avons pris les champs de chaque ligne divisés en virgule ( , ) dans une list ( fields ), puis nous avons vérifié les conditions sur les champs obligatoires.