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!!
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
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
Comment est avec la commande 'grep' ici:)
grep -Fvf oneColumnedFile listFile > outfile