Bandingkan dua daftar URL dan cetak URL yang baru ditambahkan ke file baru


8

Saya awalnya membuat dua file yang berisi daftar URL — saya akan menyebutnya sebagai olddan new. Saya ingin membandingkan dua file dan jika ada URL di newfile yang tidak ada dalam oldfile, saya ingin ini ditampilkan dalam extra_urlsfile.

Sekarang, saya sudah membaca beberapa hal tentang menggunakan diffperintah tetapi dari apa yang bisa saya katakan, ini juga menganalisis urutan informasi. Saya tidak ingin pesanan memiliki efek pada output. Saya hanya ingin URL tambahan newdicetak ke extra_urlsfile, tidak peduli apa urutannya ditempatkan di salah satu dari dua file lainnya.

Bagaimana saya bisa melakukan ini?

Jawaban:


14

Anda dapat menggunakan commperintah untuk membandingkan dua file, dan secara selektif menunjukkan baris yang unik untuk satu atau yang lain, atau garis yang sama. Ini membutuhkan input untuk diurutkan, tetapi Anda dapat mengurutkannya dengan cepat, dengan menggunakan substitusi proses.

comm -13 <(sort old.txt) <(sort new.txt)

Jika Anda menggunakan versi bashyang tidak mendukung substitusi proses, itu dapat ditiru menggunakan pipa bernama. Contohnya ditampilkan di Wikipedia .


Ringkas tetapi efektif - persis apa yang dibutuhkan, sedikit kode yang sangat baik untuk apa yang saya butuhkan.
sekitar

Hmm, tetapi jika input diurutkan, maka diffakan melakukan hal yang sama, bukan?
justhalf

diffakan menunjukkan semua perbedaan. commmemungkinkan Anda untuk memilih apakah Anda ingin melihat garis-garis dari file 1, file 2, atau yang mereka miliki bersama.
Barmar

Hai Barmar, tidak yakin Anda akan memeriksa ini tetapi hanya memetikan, saya telah memindahkan skrip ini ke Synology Nas saya untuk menjalankan dari sana. Karena menjalankan skrip saya dari Synology, saya sekarang mendapatkan kesalahan sintaksis: baris 60: kesalahan sintaksis: tak terduga "("
neilH

Versi apa yang bashsedang dijalankan? Itu mungkin tidak mendukung penggantian proses.
Barmar

6

Saya hanya akan menggunakan grep:

grep -vFf old new > extra_urls

Penjelasan

  • -f: memberitahu grepuntuk membaca pola pencariannya dari file. Dalam hal ini old,.
  • -v : memberitahu grep untuk membalikkan kecocokan, untuk hanya mencetak garis yang tidak cocok.
  • -F: memberitahu grep untuk mengartikan pola pencariannya sebagai string, bukan ekspresi reguler. Dengan begitu, .URL akan dicocokkan secara harfiah.

Digabungkan, ini membuat grepmencetak garis apa pun newyang tidak ada di old. Urutan URL dalam file tidak relevan.


Hai terdon, Terima kasih atas masukan Anda. Saya baru saja menguji ini dan menghasilkan file "ekstra url" kosong meskipun ada url baru di file "baru".
neilH

@ bms9nmh hmm, itu aneh. Harap edit pertanyaan Anda untuk memberikan contoh file input Anda. Anda mungkin juga ingin masuk ke ruang obrolan situs tempat kami dapat membahas ini lebih lanjut.
terdon

2
Anda ingin menambahkan -Funtuk pola teks biasa
glenn jackman

1

Karena pesanan penting bagi Anda, gunakan awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra

1
Hai Glen, hanya untuk memperjelas, pesanan tidak penting. Url url bukan masalah, hanya perbedaan antara dua file yaitu url tambahan. Saya tidak ingin perbedaan untuk mempengaruhi output dengan cara apa pun.
neilH

@ bms9nmh: Anda bisa mengubahnya > extramenjadi | sort > extra. atau | sort -u > extrajika Anda hanya ingin url baru muncul di output satu kali, terlepas berapa kali itu dalam input. Urutan input bertanggung jawab untuk mempengaruhi urutan output kecuali Anda melakukan pekerjaan ekstra di suatu tempat untuk mencegahnya.
Steve Jessop

@steve, meh, commadalah jawaban terbaik untuk pertanyaan ini, meskipun grep -Fvfbagus juga
glenn jackman

0

Saya memiliki aplikasi yang disebut berbaur. Ini memungkinkan melihat dua (atau tiga) file, berdampingan, menunjukkan perbedaan dan memungkinkan untuk menyalin selektif dari satu ke yang lain atau menghapus karakter.

Meld dapat diinstal dari terminal dengan

sudo apt-get install meld 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.