2017-10-14 1 views
0

J'ai un fichier texte de format suivantsupprimer les lignes avec mot clé similaire si elles apparaissent dans des lignes consécutives

sam has got grade B 
score for him is 70 
bob has got grade A 
score for him is 90 
score for him is 60 
ronny has got grade B 
score for him is 75 
tony has got grade A 
score for him is 91 

Comme on le voit la ligne 4 et la ligne 5 ont tous deux points et la ligne de qualité est manquant avant la ligne 5 .

d'une façon que je pouvais penser

grep « année » fichier.TXT -A 1

Cependant cela ne filtraient que des lignes où qualité est manquant. Il pourrait y avoir quelques lignes où la note est là mais le score est manquant.

Existe-t-il une autre meilleure commande dans unix/linux avec laquelle nous pouvons supprimer des lignes consécutives qui ont deux lignes contenant une note ou un score.

Répondre

1

Voici ma solution awk,

awk '{ if (prev != $2 $3 $4) {print $0} ; prev = $2 $3 $4 ; }' file.txt 

Notez que cette solution a un bug mineur qui est s'il y a plusieurs lignes semblables à la fin, il la sortie d'une ligne supplémentaire à la fin qui peut être facilement enlevé. Par défaut, utilisez les espaces pour séparer les mots de chaque ligne et nommez-les $ 1, $ 2, $ 3, etc. pour chaque mot dans l'ordre. prev = $2 $3 $4; va enregistrer le deuxième + troisième + quatrième mot dans la variable prev. s'il y a des lignes consécutives dans votre cas, $ 2, $ 3, $ 4 seront les mêmes que ceux de la ligne précédente. Si ce n'est pas la même chose, print $0 imprime la ligne entière.

+0

Merci beaucoup, ça a très bien fonctionné. Pourriez-vous s'il vous plaît fournir des explications sur la façon dont cela fonctionne – Zoro99

+0

sûr. Je vais l'ajouter à ma réponse. –

0

Pas Bash ligne de commande, mais si vous voulez vous débarrasser de deux lignes consécutives ayant soit à la fois « de qualité » ou « score », vous pouvez ouvrir vim et exécuter

:%s/^score.*\zs\nscore.*$// 

Pour éliminer les lignes commençant par « score » suivant une ligne qui commence par « score », et

:%s/grade.*\zs\n.*grade.*$// 

Pour éliminer les lignes qui ont « qualité » en les suivant une ligne avec « note en elle.