(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))