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.