Penggunaan gabungan dengan dua file gagal pada ukuran file yang lebih besar

2

Saya mengalami beberapa masalah dengan skrip yang menggunakan gabung untuk menggabungkan dua file. File input Eaxmple berisi baris seperti ini:

Berikut adalah file input dan output dari perintah join:

D:\work\BuildScripts\3C>cat D:\temp\aaa.txt
hzapplications\adn\adn4\adn4density\adn4_idd_module.cpp,83
hzapplications\adn\adn4\adn4density\adn4dencalmodule.cpp,73
hzapplications\adn\adn4\adn4density\adn4denimagemodulerm.cpp,111
hzapplications\adn\adn4\adn4density\adn4denimagemodulert.cpp,202
hzapplications\adn\adn4\adn4density\adn4densityanqmodules.cpp,445
hzapplications\adn\adn4\adn4density\adn4densityappl.cpp,378
hzapplications\adn\adn4\adn4density\adn4densityappl.h,50
hzapplications\adn\adn4\adn4density\adn4densityevrmodules.cpp,272
hzapplications\adn\adn4\adn4density\adn4densitykernel.cpp,490
hzapplications\adn\adn4\adn4density\adn4densitykernel.h,65
hzapplications\adn\adn4\adn4density\adn4densitysecimgmodule.cpp,209
hzapplications\adn\adn4\adn4density\adn4densitysecimgmodule.h,70
hzapplications\adn\adn4\adn4density\adn4densitysecmodule.cpp,218
hzapplications\adn\adn4\adn4density\adn4densitysecmodule.h,70
hzapplications\adn\adn4\adn4density\adn4dphimodules.cpp,610
hzapplications\adn\adn4\adn4density\adn4dphimodulesrt.cpp,115
hzapplications\adn\adn4\adn4density\adn4rhomodulesrt.cpp,102

D:\work\BuildScripts\3C>cat D:\temp\bbb.txt
hzapplications\activect\ptc\ictsx01\ictsx01_bootuptask.cpp,1
hzapplications\activeps\iola\acquisition\iola_acqmodule.cpp,4
hzapplications\activeps\iola\simulation\iola_simmodule.cpp,3
hzapplications\activeps\iolr\simulation\iolr_simmodule.cpp,1
hzapplications\activeps\iolr\task\iolr_poweron200vhitask.cpp,1
hzapplications\activeps\iolr\task\iolr_poweron200vlowtask.cpp,1
hzapplications\activeps\iolr\task\iolr_poweronnrlvtask.cpp,1
hzapplications\activeps\iolr\task\iolrtaskcommon.cpp,2
hzapplications\adn\adn4\adn4density\adn4densitykernel.cpp,1
hzapplications\adn\adn4\adn4equipment\adn4adseelem.cpp,1
hzapplications\adn\adn4\adn4equipment\adn4collar.cpp,1
hzapplications\adn\adn4\adn4equipment\adn4tool.cpp,2
hzapplications\adn\adn6c\adn6cequipment\adn6ccollar.cpp,1
hzapplications\adn\adn8\adn8equipment\adn8tool.cpp,1
hzapplications\adn\adn8\adn8neutron\adn8neutronkernel.cpp,1
hzapplications\adn\adn8d\adn8ddensity\adn8ddensitykernel.cpp,1
hzapplications\adn\adn8d\adn8dequipment\adn8dtool.cpp,1

D:\work\BuildScripts\3C>join --ignore-case -1 1 -2 1 -t"," -o "1.1,1.2,2.2" -e "0" -a 1 D:\temp\aaa.txt D:\temp\bbb.txt
hzapplications\adn\adn4\adn4density\adn4_idd_module.cpp,83,0
hzapplications\adn\adn4\adn4density\adn4dencalmodule.cpp,73,0
hzapplications\adn\adn4\adn4density\adn4denimagemodulerm.cpp,111,0
hzapplications\adn\adn4\adn4density\adn4denimagemodulert.cpp,202,0
hzapplications\adn\adn4\adn4density\adn4densityanqmodules.cpp,445,0
hzapplications\adn\adn4\adn4density\adn4densityappl.cpp,378,0
hzapplications\adn\adn4\adn4density\adn4densityappl.h,50,0
hzapplications\adn\adn4\adn4density\adn4densityevrmodules.cpp,272,0
hzapplications\adn\adn4\adn4density\adn4densitykernel.cpp,490,0
hzapplications\adn\adn4\adn4density\adn4densitykernel.h,65,0
hzapplications\adn\adn4\adn4density\adn4densitysecimgmodule.cpp,209,0
hzapplications\adn\adn4\adn4density\adn4densitysecimgmodule.h,70,0
hzapplications\adn\adn4\adn4density\adn4densitysecmodule.cpp,218,0
hzapplications\adn\adn4\adn4density\adn4densitysecmodule.h,70,0
hzapplications\adn\adn4\adn4density\adn4dphimodules.cpp,610,0
hzapplications\adn\adn4\adn4density\adn4dphimodulesrt.cpp,115,0
hzapplications\adn\adn4\adn4density\adn4rhomodulesrt.cpp,102,0

D:\work\BuildScripts\3C>

Output yang diharapkan adalah bahwa baris khusus ini digabungkan seperti: hzapplications \ adn \ adn4 \ adn4density \ adn4densitykernel.cpp, 490,1

Semua saran sangat disambut. Saya menggunakan paket unxutils di windows, ini adalah versi persisnya:

D:\work\BuildScripts\3C>join --version
join (GNU textutils) 2.0
Written by Mike Haertel.

Copyright (C) 1999 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
mikelong
sumber
Saya hanya membaca sekilas ini tetapi ... apakah file Anda diurutkan? bergabung tidak berfungsi jika file input tidak diurutkan pada bidang bergabung.
Alan Curry
Hai Alan, terima kasih atas sarannya. Ya, file input harus diurutkan, tetapi untuk memastikan bahwa saya telah memperbarui skrip pengujian untuk memasukkan semacam sebelum melakukan join.
mikelong
Ini adalah versi yang sangat lama join, dapatkah Anda mencoba versi yang lebih baru?
Thor
3
Itu tidak benar-benar mengurutkan pada bidang gabung. Anda memerlukan sort -t ',' -k 1,1yang dapat menghasilkan hasil yang berbeda untuk beberapa input. Versi terbaru GNU coreutils memiliki join --check-orderopsi yang akan membantu. Akan lebih mudah untuk melihat apa yang salah jika Anda hanya memposting file aktual aaadan bbbuntuk kasus pengujian Anda yang gagal. Semua hal yang mengarah pada kreasi mereka tidak relevan, membosankan, dan tidak dapat direproduksi oleh kita.
Alan Curry
Hai Alan, terima kasih telah mengarahkan saya ke perintah sortir yang benar. Saya telah mengedit pertanyaan untuk menambahkan file input mentah dan output dari perintah join.
mikelong

Jawaban:

3

Ternyata itulah --ignore-casemasalahnya. Ini memiliki efek bahkan ketika tidak ada huruf besar karena memperlakukan semua huruf kecil sebagai huruf besar, menyebabkan mereka melompat ke sisi lain dari karakter yang berada di antara huruf besar dan huruf kecil dalam urutan ASCII:[\]^_

Dalam urutan normal, iolrtdatang setelah iolr_tetapi --ignore-caseagar terbalik.

The sortperintah membutuhkan -fpilihan untuk menghasilkan urutan yang benar. (Selain -t,dan -k1,1)

Alan Curry
sumber