Gunakan daftar kata untuk melihat daftar lain

8

Saya punya daftar dengan 250 baris di dalamnya. Saya harus menjalankan semuanya melalui server web untuk mendapatkan daftar output. Namun daftar ini menghasilkan lebih banyak baris, daripada yang saya minati. Katakanlah, saya list.txtadalah:

a.1
b.1
etc

maka outputnya adalah output.txt:

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

Apakah mungkin menggunakan perintah grep untuk mencari semua kata di list.txt di output.txt dan kemudian menghasilkan daftar "yang diinginkan" ingin.txt? Saya membutuhkan seluruh baris di output.txt saya, saya baru dalam skrip, tapi apa yang saya suka adalah sesuatu seperti

grep list.txt output.txt > wanted.txt

Saya belum dapat menemukan contohnya

Ditte
sumber
Apakah keduanya dalam urutan abjad seperti contoh Anda?
Oli
Tidak, saya memiliki urutan non-alfabet tertentu di list.txt saya, tetapi output.txt alfabet, tetapi saya ingin itu hanya berisi "klik" untuk list.txt dalam urutan non-alfabet yang sama
Ditte

Jawaban:

11

Saya akan mengabaikan yang grepini. Ini bagus untuk ekspresi reguler tetapi sepertinya Anda tidak benar-benar membutuhkannya di sini. commdapat membandingkan dua file dan menunjukkan persimpangan. Menggunakan contoh persis Anda:

$ comm -12 list.txt output.txt 
a.1
b.1
etc

Ini lebih cepat daripada grep apa pun tetapi bergantung (berat) pada file yang sedang disortir. Jika tidak, Anda dapat melakukan pre-sortir tetapi itu akan mengubah output sehingga diurutkan juga.

comm -12 <(sort list.txt) <(sort output.txt) 

Atau, jawaban dari iiSeymour ini akan membuat Anda melakukannya grep. Bendera meminta file input dan memaksa pencarian kata lengkap dengan string tetap. Ini tidak akan bergantung pada pesanan tetapi akan didasarkan pada output.txtpesanan. Balikkan file jika Anda menginginkannya dalam urutan list.txt.

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

Jika Anda list.txtadalah benar-benar besar, Anda mungkin harus mengatasi ini sedikit lebih iteratif dan lulus setiap baris grep secara terpisah. Ini akan secara besar-besaran meningkatkan waktu pemrosesan. Di atas Anda akan membaca output.txtsekali, tetapi dengan cara ini Anda akan membaca dan memprosesnya untuk setiap baris list.txt. Mengerikan ... Tapi mungkin itu satu-satunya pilihanmu. Pada sisi positifnya, ia kemudian menyortir berdasarkan list.txtpesanan.

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc
Oli
sumber
1
Itu sangat pintar! Apa alasan untuk -12?
Ditte
3
-1menekan baris unik ke file pertama, -2menekan baris unik untuk file kedua, dan -3menekan baris yang sama untuk keduanya. Untuk mendapatkan garis yang sama, kami menekan yang unik, karenanya -12.
Oli
bagus! Saya pikir saya akan menggunakan perintah comm. Dan kemudian ketika saya ingin mengurutkan output.txt memiliki urutan yang sama dengan list.txt, saya hanya akan menggunakan comm -12 <(sort list.txt) <(sort output.txt) sesudahnya?
Ditte
Perintah comm tidak memberi saya seluruh baris di result.txt (dan saya perlu semuanya untuk mendapatkan info dari sana). Tetapi jika saya mencoba perintah grep itu menjanjikan saya dengan grep: kehabisan memori. Apakah itu berarti terlalu besar?
Ditte
contoh ke-2 memiliki redundan STDIN redirect shell akan ditandai sebagai kesalahan. baik membuat file temp atau menggunakan fd tambahan dengan semacam latar belakang pipelined untuk itu (rumit di kebanyakan shell) ... ini lebih merupakan pertanyaan pemrograman yang lebih baik ditanyakan pada Stack Overflow . secara pribadi, saya akan melakukan ini dengan python.
Skaperen