GNU/Linux >> Belajar Linux >  >> Linux

Garis Umum Antara Dua File?

Pertanyaan ini sudah memiliki jawaban di sini :Output baris umum (kesamaan) dari dua file teks (kebalikan dari diff)?

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

Linux
  1. Cetak Garis Antara (dan Tidak Termasuk) Dua Pola?

  2. Cetak Garis Antara (dan Termasuk) Dua Pola?

  3. Cetak Dua File Dalam Dua Kolom?

  1. Bandingkan Dua Kolom File Yang Berbeda Dan Cetak Jika Cocok?

  2. Ekstrak Teks Antara Dua Baris Tertentu?

  3. Lum – Ganti Nilai Umum Dalam Dua File Menurut Kolom Pertama?

  1. Produk Cartesian dari dua file (sebagai kumpulan baris) di GNU/Linux

  2. mengekstraksi nilai unik antara 2 set/file

  3. Hitung baris dalam file besar