Pertanyaan ini sangat terkait dengan ini dan pertanyaan ini . Saya memiliki file yang berisi beberapa baris di mana setiap baris adalah jalur ke file. Sekarang saya ingin memasangkan setiap baris dengan setiap baris yang berbeda (bukan dirinya sendiri). Sepasang A B
juga sama dengan B A
sepasang untuk keperluan saya, jadi hanya satu dari kombinasi ini yang harus dihasilkan.
Contoh
files.dat
berbunyi seperti ini dalam notasi singkat, setiap huruf adalah path file (absolut atau relatif)
a
b
c
d
e
Maka hasil saya akan terlihat seperti ini:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Lebih disukai saya ingin menyelesaikan ini di bash. Berbeda dengan pertanyaan lain, daftar file saya agak kecil (sekitar 200 baris), jadi menggunakan loop dan kapasitas RAM tidak menimbulkan masalah.
Jawaban:
Gunakan perintah ini:
PROCINFO
mungkingawk
ekstensi. Jika Andaawk
tidak mendukungnya, tinggalkan sajaPROCINFO["sorted_in"] = "@ind_str_asc"
saluran dan pipa outputsort
(jika Anda ingin output diurutkan).(Ini tidak memerlukan input untuk diurutkan.)
sumber
Ini mengasumsikan bahwa tidak ada baris dalam file input berisi spasi. Itu juga mengasumsikan bahwa file diurutkan .
The
join
perintah menciptakan produk silang penuh dari baris dalam file. Ini dilakukan dengan menggabungkan file dengan dirinya sendiri di bidang yang tidak ada. Non-standar-j 2
dapat digantikan oleh-1 2 -2 2
(tetapi tidak dengan-j2
kecuali Anda menggunakan GNUjoin
).The
awk
perintah membaca hasil ini dan hanya output hasil yang pasangan yang belum terlihat.sumber
sort -b
akan mengurutkannya.join
memerlukan file input yang diurutkan.Sebuah
python
solusi. File input diumpankan keitertools.combinations
dari perpustakaan standar, yang menghasilkan tuple 2-panjang yang diformat dan dicetak ke output standar.sumber
Jika Anda telah
ruby
menginstal:-0777
slurp seluruh file (harus baik-baik saja seperti yang disebutkan dalam OP bahwa ukuran file kecil)-F'\n'
perpecahan berdasarkan baris baru, sehingga setiap baris akan menjadi elemen dalam$F
array$F.combination(2)
menghasilkan2
elemen kombinasi sekaligus{ |c| puts c.join(" ")}
cetak sesuai kebutuhan$F.uniq.combination(2)
untuk 3 elemen sekaligus:
Dengan
perl
(bukan generik)Dengan
awk
sumber
Inilah satu di shell murni.
Contoh:
sumber
<file.dat xargs test.sh
daritest.sh $(cat file.dat)
Menggunakan
Perl
kita bisa melakukannya seperti yang ditunjukkan:sumber