C’était l’une des premières choses que j’ai apprises sur awk.
Tout a commencé quand j’ai dû gérer un fichier de 700k SNP. Dans une étape du processus, j’ai du filtrer ce fichier en me basant sur une liste d’identifications. Je me souviens que j’ai essayé de le faire avec R et il n’a pas fonctionné comme je m’y attendais (mon PC a gelé à chaque tentative). Donc, j’ai utilisé une autre approche.
J’ai trouvé la solution avec awk, en utilisant la commande suivante:
# Filtrer SNP.txt par la première colonne basée sur la première colonne de ID.txt
$ awk 'FNR==NR {arr[$1]; next} ($1 in arr) {print $0}' ID.txt SNP.txt > filteredSNP.txt
En bref, dans la première partie ({arr[$1]; next}
), awk stockera la première colonne de ID.txt dans « arr ». Ensuite, il comparera les valeurs de la première colonne de SNP.txt avec celles de « arr » (($1 in arr)
). Enfin, lorsque les deux valeurs correspondent, il retournera la ligne de SNP.txt ({print $0}
).
Ici vous trouverez plus d’informations sur ce que fait la commande, même lorsque la discussion dans le lien est sur FNR==NR
.
Peut-être que quelques exemples peuvent être utiles.
# Préparer les fichiers d'exemple
$ echo "a 1
a 2
a 1
a 2
b 1
b 2
b 1
b 2
c 3" > A.txt
$ echo "a b 1 2" > B.txt
# Exemples du comportement de la commande
$ awk 'FNR==NR { a[$1]; next } ($1 in a) {print $0}' B.txt A.txt
a 1
a 2
a 1
a 2
$ awk 'FNR==NR { a[$2]; next } ($1 in a){print $0}' B.txt A.txt
b 1
b 2
b 1
b 2
$ awk 'FNR==NR { a[$3]; next } ($2 in a){print $0}' B.txt A.txt
a 1
a 1
b 1
b 1
$ awk 'FNR==NR { a[$4]; next } ($2 in a) {print $0}' B.txt A.txt
a 2
a 2
b 2
b 2
$ awk 'FNR==NR { a[$4]; next } ($2 in a) {print $1}' B.txt A.txt
a
a
b
b
$ awk 'FNR==NR { a[$4]; next } ($2 in a) {print $2}' B.txt A.txt
2
2
2
2
$ awk 'FNR==NR { a[$4]; next } ($2==3) {print $0}' B.txt A.txt
c 3