2013-06-19 3 views
4

Voici mon fichier d'entrée, input.txt:Suppression d'une ligne avec un motif spécifique dans un champ

Value Value1 value2
5 1 2
1 4 3
2 1 5.5
0 0 0
4 1 0

Je dois chercher la valeur (5.5) dans la 3ème colonne, si trouvée dans EED pour enlever la rangée entièrement.

Et je besoin de la sortie comme ci-dessous, output.txt:

Value Value1 value2
5 1 2
1 4 3
0 0 0
4 1 0

j'ai essayé la commande awk pour supprimer la ligne, mais je suis coincé avec la partie ci-dessous (???). Ne pas à comment enlever la ligne entière de la commande awk. S'il vous plaît suggérer le moyen d'y parvenir. Merci!
awk -F"\t" '{if($3==5.5) ??? }'

Répondre

7

Si vous voulez exclure toutes les lignes avec la valeur de 3ème colonne 5.5 puis:

awk '$3!=5.5' filename 
+0

Merci pour resposne. 'awk '$ 3! = 5.5' filename 'cette commande fonctionnera sans condition if, désolé si c'est trop basique. En ce moment je n'ai pas de PC à tester, essayer plus tard. – Marjer

+0

Oui. awk imprimera toutes les lignes par défaut. La condition est donc d'exclure les lignes dont la troisième colonne a la valeur '5.5'. –

0
perl -lane 'next if($F[2]=~/5.5/);print' your_file 

si la troisième colonne a 5.5 puis cette ligne sera supprimée. Mais si la troisième colonne est 5.52 ou 15.53, alors avec la commande ci-dessus ils seront supprimés. Donc, si vous voulez seulement supprimer la ligne si elle a 5.5 correspondance exacte puis utilisez ci-dessous:

perl -lane 'next if($F[2]=~/\b5.5\b/);print' your_file 

testé ci-dessous:

> cat temp 
Value Value1 value2 
5 1 2 
1 4 3 
2 1 5.51 
2 1 5.5 
0 0 0 
4 1 0 
> 

Avec la première commande:

> perl -lane 'next if($F[2]=~/5.5/);print' temp 
Value Value1 value2 
5 1 2 
1 4 3 
0 0 0 
4 1 0 
> 

Avec la deuxième commande:

> perl -lane 'next if($F[2]=~/\b5.5\b/);print' temp 
Value Value1 value2 
5 1 2 
1 4 3 
2 1 5.51 
0 0 0 
4 1 0 
> 
+0

J'aurais préféré 'unless':' print unless ($ F [2] = ~/5.5 /); '. Semble plus lisible. YMMV. – devnull

+0

Merci pour la réponse, j'ai utilisé awk pour résoudre ce problème. – Marjer

+0

Il y a un bug dans ça. La correspondance devrait être '$ F [2] = ~/5 \ .5 /'. Mais je ne peux m'empêcher de me demander pourquoi vous n'avez pas utilisé '$ F [2] eq '5.5''. –

4

GNU plus sûr sed

sed -r '/\s*(\S+\s+){2}5.5/d' file 
Questions connexes