(5 jawaban)
Tutup 3 tahun lalu.
Saya memiliki kode berikut yang saya jalankan di Terminal saya.
LC_ALL=C && grep -F -f genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed
Ini tidak memberi saya garis umum antara dua file. Apa yang saya lewatkan di sana?
Jawaban yang Diterima:
Gunakan comm -12 file1 file2
untuk mendapatkan baris yang sama di kedua file.
Anda mungkin juga perlu mengurutkan file Anda ke comm
untuk bekerja seperti yang diharapkan.
comm -12 <(sort file1) <(sort file2)
Dari man comm
:
-1 suppress column 1 (lines unique to FILE1)
-2 suppress column 2 (lines unique to FILE2)
Atau menggunakan grep
perintah yang perlu Anda tambahkan -x
pilihan untuk mencocokkan seluruh baris sebagai pola yang cocok. F
opsi memberi tahu grep
pola yang cocok sebagai string bukan kecocokan ekspresi reguler.
grep -Fxf file1 file2
Atau menggunakan awk
.
awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2
Ini membaca seluruh baris file1 ke dalam array yang disebut seen
dengan kunci sebagai seluruh baris (dalam awk
$0
mewakili seluruh baris saat ini).
Kami menggunakan NR==FNR
sebagai syarat untuk menjalankan blok yang diikutinya hanya untuk input pertama fle1 bukan file2 , karena NR
di awk
lihat nomor baris pemrosesan saat ini dan FNR
mengacu pada nomor baris saat ini di semua masukan. jadi NR
unik untuk setiap file input tetapi FNR
unik untuk semua masukan.
next
apakah ada yang memberi tahu awk
jangan melanjutkan kode istirahat dan mulai lagi sampai NR
wan tidak sama dengan FNR
itu berarti semua baris file1 dibaca oleh awk
.
Kemudian seen[$0]
hanya akan berjalan untuk file2 kedua second dan untuk setiap baris di file2 akan melihat ke dalam larik dan akan mencetak baris itu di tempat yang memang ada dalam larik.
Opsi sederhana lainnya adalah menggunakan sort
dan uniq
:
sort file1 file2|uniq -d
Ini akan mencetak kedua file yang diurutkan kemudian uniq -d
hanya akan mencetak baris yang digandakan. NAMUN ini diberikan ketika TIDAK ada baris duplikat di kedua file itu sendiri, yang lain di bawah ini selalu diberikan bahkan jika ada baris yang diduplikasi dalam kedua file.
uniq -d <(sort <(sort -u file1) <(sort -u file2))