Comment imprimer uniquement les lignes qui ont une valeur dans la 4ème colonne?

Je m’excuse si cela a été demandé / répondu; Je n’ai pas trouvé de réponse en cherchant.

J’ai un très long fichier texte, et seule une infime partie des lignes a une valeur dans la 4ème colonne, ce qui est important pour moi. Comment puis-je imprimer uniquement ces lignes?

Voici mes données:

gi|254160123|ref|NC_012967.1| 585236 C gi|254160123|ref|NC_012967.1| 585237 C gi|254160123|ref|NC_012967.1| 585238 A gi|254160123|ref|NC_012967.1| 585239 C 4 gi|254160123|ref|NC_012967.1| 585240 A gi|254160123|ref|NC_012967.1| 585241 A gi|254160123|ref|NC_012967.1| 585242 C gi|254160123|ref|NC_012967.1| 585243 T 16 gi|254160123|ref|NC_012967.1| 585244 G 6 gi|254160123|ref|NC_012967.1| 585245 C 2 gi|254160123|ref|NC_012967.1| 585246 G 3 gi|254160123|ref|NC_012967.1| 585247 C 9 

Je souhaite imprimer uniquement les lignes avec une valeur dans la quasortingème colonne (lignes 4, 8, 9, 10, 11, 12 dans cet exemple).

Depuis que vous avez demandé une solution en Python, en voici une. Il lit chaque ligne du fichier, puis le divise en colonnes sur l’espace blanc; si les colonnes après le quasortingème (index 3) sont vides, elles ne s’impriment pas.

 with open(filename, 'r') as f: for line in f: if line.split()[3:]: print line 

Vous pourriez trouver le module csv plus robuste lorsque vous travaillez avec des fichiers en colonnes, mais il est un peu exagéré pour le problème indiqué et ne conserve pas le format de l’entrée.

Comme vous n’avez pas posté d’échantillon de votre fichier de données, je vais vous donner un exemple générique sur la façon d’extraire des colonnes spécifiques en utilisant awk … Vous pouvez utiliser gawk (gnu-awk) comme

eh bien, le concept est similaire, supposons que vous ayez un fichier (liste BBS),

 alpo-net 555-3412 2400/1200/300 A bites 555-1675 2400/1200/300 A fooey 555-1234 2400/1200/300 B foot 555-6699 1200/300 B macfoo 555-6480 1200/300 A sdace 555-3430 2400/1200/300 A sabafoo 555-2127 1200/300 C 

si vous souhaitez imprimer des secondes colonnes avec les premiers enregistrements de colonne ‘EXACT’ correspondant à ‘foo’

vous pouvez utiliser–

 $ awk '$1 == "foo" { print $2 }' BBS-list 

mais comme ils sont fooey, macfoo, sabafoo etc etc, vous n’obtiendrez aucune sortie.

Voici la correspondance de motif, au lieu de “foo”, vous pouvez utiliser, correspondance de modèle / foo /

 $ awk '$1 ~ /foo/ { print $2 }' BBS-list 

le résultat sera celui de fooey, foot, macfoo et sabafoo,

 555-1234 555-6699 555-6480 555-2127 

exemple de courtoisie (univ. de l’Utah)

Par conséquent, pour isoler la valeur NULL, vous pouvez utiliser,

 awk '$2==""' myfile.txt //$2 means third column (as you asked) 

Mais après des recherches et des tests sur mon système, j’ai été déconcerté par le fait que je ne peux pas isoler des valeurs nulles en utilisant awk . Il ne peut pas différencier NULL et Space. Le problème est que vous devez mentionner spécifiquement le délimiteur. La meilleure façon de faire est d’utiliser l’ onglet comme séparateur de champs. Par conséquent, vous pouvez utiliser,

 awk 'BEGIN {FS="\t"} $2=="" {print}' myfile.txt 

Je pense que cela devrait résoudre votre dilemme.

Utilisez simplement awk pour imprimer uniquement les lignes comportant quatre champs:

 awk 'NF==4' /path/to/input # Num Fields == 4 

Par défaut, awk ignore les espaces de début et de fin (qui, dans les parameters régionaux communs, signifient “espaces et tabulations”). Ainsi, vos enregistrements souhaités seront considérés comme ayant quatre champs (le 1st le 2nd onglet> le 3rd le 4th onglet> , tandis que les autres en auront trois (le 1st le 2nd onglet> le 3rd onglet> ). Si aucune action ” awk ” n’est spécifiée, l’action par défaut consiste à imprimer la ligne en cours.