web-dev-qa-db-fra.com

Supprimer la ligne d'un fichier nommé dans un autre

J'ai la liste suivante:

NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0

Et j'ai un autre fichier avec juste la première colonne:

NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042

Je souhaite supprimer toutes les lignes du premier fichier portant le nom de second. Dans ce cas, le fichier de sortie sera:

NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0

(en supprimant NM_000022 et NM_00023 avec ses valeurs correspondantes)

Merci!!

5

Avec awk:

awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt

Entrez le fichier avec une seule colonne comme premier argument et celui à vérifier pour l'appartenance (première colonne) comme second argument.

  • NR==FNR {a[$0]; next}, ici NR==FNR ne sera vrai que pour le premier fichier, puis nous sauvegardons chaque ligne dans le tableau a pour pouvoir tester l'appartenance du premier argument du second fichier, alors nous allons à la ligne suivante sans autre opération sur le deuxième fichier

  • {if ($1 in a) next}; 1 sera exécuté uniquement pour le deuxième fichier, celui à vérifier. Nous vérifions ici si le premier argument séparé par des espaces est dans le tableau a, s'il est présent, puis passe à la ligne suivante, sinon affiche le ligne entière.

Exemple:

$ cat f1.txt 
NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042

$ cat f2.txt 
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0

$ awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0
6
heemayl

Vous pouvez également utiliser sed avec une boucle Bash.

Cette commande modifie file1 en place (créant une sauvegarde file1.bak), en supprimant chaque ligne commençant par une ligne quelconque de file2:

while read line ; do sed -i.bak "/$line.*/d" file1 ; done < file2
2
Byte Commander

Comment est avec la commande 'grep' ici:)

grep -Fvf oneColumnedFile listFile > outfile
1
αғsнιη