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