Saya memiliki "test1.csv" dan isinya
200,400,600,800
100,300,500,700
50,25,125,310
dan test2.csv dan itu berisi
100,4,2,1,7
200,400,600,800
21,22,23,24,25
50,25,125,310
50,25,700,5
sekarang
diff test2.csv test1.csv > result.csv
berbeda dari
diff test1.csv test2.csv > result.csv
Saya tidak tahu yang mana urutan yang benar tetapi saya menginginkan yang lain, kedua perintah di atas akan menampilkan sesuatu seperti
2 > 100,4,2,1,7
3 2,3c3,5
4 < 100,300,500,700
5 < 50,25,125,310
6 \ No newline at end of file
7 ---
8 > 21,22,23,24,25
9 > 50,25,125,310
Saya ingin hanya menghasilkan perbedaan, sehingga results.csv akan terlihat seperti ini
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Saya mencoba diff -q
dan diff -s
tetapi mereka tidak melakukan trik. Ketertiban tidak masalah, yang penting adalah aku hanya ingin melihat perbedaannya, tidak ada> atau <atau ruang kosong.
grep -FvF
melakukan trik pada file yang lebih kecil bukan pada file besar
file pertama berisi lebih dari 5 juta baris, file kedua berisi 1300.
jadi results.csv akan menghasilkan ~ 4.998.700 baris
Saya juga mencoba grep -F -x -v -f
yang tidak berhasil.
50,25,125,310
umum untuk kedua file .. Anda harus menghapus itu dari output yang Anda inginkan ..Jawaban:
Kedengarannya seperti pekerjaan untuk
comm
:Sebagaimana dijelaskan dalam
man comm
:Jadi,
-3
berarti hanya baris yang unik untuk salah satu file yang akan dicetak. Namun, itu diberi indentasi sesuai dengan file tempat mereka ditemukan. Untuk menghapus tab, gunakan:Dalam hal ini, Anda bahkan tidak perlu mengurutkan file dan Anda dapat menyederhanakan di atas untuk:
sumber
200,[...]
baris ya? :)Menggunakan
grep
denganbash
substitusi proses:Untuk menyimpan output sebagai
results.csv
:<()
adalahbash
pola substitusi prosesgrep -vFf test2.csv test1.csv
akan menemukan garis yang unik hanyatest1.csv
grep -vFf test1.csv test2.csv
akan menemukan garis yang unik hanyatest2.csv
Akhirnya kami menyimpulkan hasilnya
cat
Atau seperti yang disarankan Oli , Anda dapat menggunakan pengelompokan perintah juga:
Atau jalankan satu demi satu, karena keduanya menulis ke STDOUT, mereka akhirnya akan ditambahkan:
sumber
cat
dua perintah dialihkan? Mengapa tidak menjalankan satu saja lalu yang lainnya?grep ... ; grep ...
atau{ grep ... ; grep ... ; }
jika Anda ingin melakukan sesuatu dengan hasil kolektif.Jika urutan baris tidak relevan, gunakan
awk
atauperl
:Gunakan
grep
untuk mendapatkan garis yang umum dan memfilternya:Grep internal mendapatkan garis yang sama, kemudian grep eksternal menemukan garis yang tidak cocok dengan garis umum ini.
sumber
sort | uniq -u
, yang memberikan jawaban yang salah ketika satu file berisi duplikat baris. Untuk grep, saya akan mengatakan "dalam" / "luar", bukan "internal" / "eksternal".awk
akan mencetak dan apacomm -3
dandiff
jawaban akan mencetak.comm -3
. Saya tidak melihat alasan mengapa saya harus menjelaskan itu. Jika Anda ingin mengedit dalam catatan, jangan ragu.Gunakan
--*-line-format=...
opsidiff
Anda dapat mengetahui dengan
diff
tepat apa yang Anda butuhkan - dijelaskan di bawah:Dimungkinkan untuk menentukan keluaran diff dengan cara yang sangat terperinci, mirip dengan
printf
format angka.Baris dari file pertama,
test1.csv
disebut baris "lama", dan baris dari file keduatest2.csv
, adalah "baru". Itu masuk akal ketikadiff
digunakan untuk melihat apa yang berubah dalam file.Opsi yang kita butuhkan adalah yang mengatur format untuk baris "lama", "baru", dan "tidak berubah".
Format yang kami butuhkan sangat sederhana:
Untuk baris yang diubah, baru dan lama, kami hanya ingin menampilkan teks dari baris tersebut.
%L
adalah simbol format untuk teks baris.Untuk garis yang tidak berubah, kami tidak ingin menunjukkan apa pun.
Dengan ini, kita dapat menulis opsi seperti
--old-line-format='%L'
, dan menggabungkan semuanya, menggunakan contoh data Anda:Catatan tentang kinerja
Karena file memiliki ukuran yang berbeda, cobalah untuk bertukar file input jika tidak masalah, bisa jadi itu cara kerja dalam
diff
dapat menangani satu cara lebih baik daripada yang lain. Lebih baik membutuhkan lebih sedikit memori, atau lebih sedikit komputasi.Ada opsi pengoptimalan untuk digunakan
diff
dengan file besar:--speed-large-files
. Ini menggunakan asumsi tentang struktur file, jadi tidak jelas apakah itu membantu dalam kasus Anda, tetapi layak untuk dicoba.Opsi format dijelaskan di
man diff
bawah--LTYPE-line-format=LFMT
.sumber
Karena pesanan tidak perlu dipertahankan, cukup:
sort test1.csv test2.csv
: gabungan dan macamnyatest1.csv
dantest2.csv
uniq -u
: hanya mencetak garis yang tidak memiliki duplikatsumber
diff
menghasilkan.