(5 odpovědí)
Uzavřeno před 3 lety.
Mám následující kód, který spouštím na svém terminálu.
LC_ALL=C && grep -F -f genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed
To mi nedává společné řádky mezi těmito dvěma soubory. Co mi tam chybí?
Přijatá odpověď:
Použijte comm -12 file1 file2
získat společné řádky v obou souborech.
Možná budete také potřebovat, aby byl váš soubor seřazen do comm
fungovat podle očekávání.
comm -12 <(sort file1) <(sort file2)
Z man comm
:
-1 suppress column 1 (lines unique to FILE1)
-2 suppress column 2 (lines unique to FILE2)
Nebo pomocí grep
musíte přidat -x
možnost sladit celý řádek jako odpovídající vzor. F
volba říká grep
které odpovídají vzoru jako řetězci, nikoli regulárnímu výrazu.
grep -Fxf file1 file2
Nebo pomocí awk
.
awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2
Toto je čtení celého řádku souboru1 do pole nazvaného seen
s klíčem jako celý řádek (v awk
$0
představují celý aktuální řádek).
Použili jsme NR==FNR
jako podmínka pro spuštění následujícího bloku pouze pro první vstup fle1 ne soubor2 , protože NR
v awk
viz aktuální číslo linky zpracování a FNR
odkazuje na aktuální číslo řádku ve všech vstupy. takže NR
je jedinečný pro každý vstupní soubor, ale FNR
je jedinečný pro všechny vstupy.
next
je tam vyprávění awk
nepokračujte v klidovém kódu a začněte znovu, dokud NR
wan se nerovná FNR
to znamená všechny řádky souboru1 přečteno pomocí awk
.
Potom další seen[$0]
poběží pouze pro druhý soubor2 a pro každý řádek v souboru2 podívá se do pole a vypíše tento řádek tam, kde v poli existuje.
Další jednoduchou možností je použití sort
a uniq
:
sort file1 file2|uniq -d
Tím se vytisknou oba soubory seřazené poté uniq -d
vytiskne pouze duplicitní řádky. ALE toto je uděleno, když v obou samotných souborech NEJSOU ŽÁDNÉ duplicitní řádky, jinak níže uvedené je vždy uděleno, i když jsou v obou souborech duplicitní řádky.
uniq -d <(sort <(sort -u file1) <(sort -u file2))