Saya mencoba menulis skrip sederhana yang akan mencantumkan konten yang ditemukan dalam dua daftar. Untuk mempermudah, mari kita gunakan ls sebagai contoh. Bayangkan "satu" dan "dua" adalah direktori.
one = `ls one` two = `ls two` persimpangan $ satu $ dua
Saya masih cukup hijau di bash, jadi jangan ragu untuk memperbaiki bagaimana saya melakukan ini. Saya hanya perlu beberapa perintah yang akan mencetak semua file dalam "satu" dan "dua". Mereka harus ada di keduanya. Anda mungkin menyebutnya "persimpangan" antara "satu" dan "dua".
Jawaban:
sumber
comm
sampai hari ini. Ini hanya membuat saya sepanjang minggu :)comm
membutuhkan input yang akan diurutkan. Dalam hal ini,ls
secara otomatis mengurutkan outputnya, tetapi kegunaan lain mungkin perlu melakukan ini:comm -12 <(some-command | sort) <(some-other-command | sort)
public
metode yangerror()
disediakan oleh suatu sifat, dikombinasikan dengangit grep
, dan itu luar biasa! Saya berlari$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
, dan untungnya saya berakhir dengan nama file hanya yang mengandung sifat tersebut.Solusi dengan
comm
comm
bagus tapi memang perlu bekerja dengan daftar yang diurutkan. Dan untungnya di sini kita gunakanls
yang darils
halaman Bash manAlternatif dengan
sort
Persimpangan dua daftar:
perbedaan simetris dari dua daftar:
Bonus
Main dengannya;)
sumber
Gunakan
comm
perintah:"sort" tidak benar-benar dibutuhkan tetapi saya selalu memasukkannya sebelum menggunakan "comm" untuk berjaga-jaga.
sumber
Alternatif yang kurang efisien (daripada komunikasi):
sumber
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
tidak melakukan apa-apa, karena pengurutan telah menghapus duplikat sebelum uniq mulai mencarinya. Saya pikir Anda belum mengerti apa yang sedang saya lakukan.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
untuk mengeluarkan apa pun. Perintah saya harus membaca(ls 1; ls 2) | sort | uniq -d
, tanpa-u
, untuk menunjukkan persimpangan daftar. @ MikaëlMayer benar bahwa perintah awal saya rusak.ls
dengan yang lain, misalnyafind
. Solusi Anda tidak mengizinkan ini, karena jika salah satu dari perintah mengembalikan dua baris yang sama, itu mengambilnya sebagai duplikat. Milik saya berfungsi bahkan jika pengguna ingin melakukanls 1/*
dan membandingkan semua file di seluruh subdirektori. Kalau tidak, ya, itu berfungsi juga. Mungkin milikku khusus untuk bash.Bergabung adalah pilihan lain yang baik tergantung pada input dan output yang diinginkan
sumber
Ada pertanyaan Stackoverflow lain "persimpangan Array di bash," yang ditandai sebagai duplikat dari ini. Ini tidak persis sama, menurut pendapat saya, karena pertanyaan itu berbicara tentang membandingkan dua array bash, sementara pertanyaan ini berfokus pada file bash. Jawaban satu baris untuk pertanyaan lain, yang sekarang ditutup, adalah sebagai berikut:
Utilitas comm melakukan semacam alfanumerik, sedangkan "Array intersection in bash" menjawab menggunakan angka; karenanya penggunaan "sort" dan "sort -g".
sumber