Saya memiliki dua file dengan masing-masing sekitar 12900 dan 4400 entri, yang ingin saya gabung. File tersebut berisi informasi lokasi untuk semua stasiun pengamatan cuaca darat di seluruh dunia. File terbesar diperbarui setiap dua minggu, dan yang lebih kecil setahun sekali atau lebih. File asli dapat ditemukan di sini ( http://www.wmo.int/pages/prog/www/ois/volume-a/vola-home.htm dan http://weather.rap.ucar.edu/surface/ station.txt ). File yang saya miliki sudah dimanipulasi oleh saya dengan beberapa campuran awk, sed, dan skrip bash. Saya menggunakan file untuk memvisualisasikan data menggunakan paket GEMPAK, yang tersedia secara bebas dari Unidata. File terbesar akan bekerja dengan GEMPAK, tetapi tidak dengan kemampuan penuhnya. Untuk ini diperlukan sebuah join.
File 1 berisi informasi lokasi untuk stasiun pengamat cuaca, di mana 6 digit pertama adalah pengidentifikasi stasiun yang unik. Parameter yang berbeda (nomor stasiun, nama stasiun, kode negara, garis lintang, dan ketinggian stasiun) hanya ditentukan oleh posisinya di garis, yaitu tidak ada tab.
060090 AKRABERG FYR DN 6138 -666 101
060100 VAGA FLOGHAVN DN 6205 -728 88
060110 TORSHAVN DN 6201 -675 55
060120 KIRKJA DN 6231 -631 55
060130 KLAKSVIK HELIPORT DN 6221 -656 75
060160 HORNS REV A DN 5550 786 21
060170 HORNS REV B DN 5558 761 10
060190 SILSTRUP DN 5691 863 0
060210 HANSTHOLM DN 5711 858 0
060220 TYRA OEST DN 5571 480 43
060240 THISTED LUFTHAVN DN 5706 870 8
060290 GROENLANDSHAVNEN DN 5703 1005 0
060300 FLYVESTATION AALBORG DN 5708 985 13
060310 TYLSTRUP DN 5718 995 0
060320 STENHOEJ DN 5736 1033 56
060330 HIRTSHALS DN 5758 995 0
060340 SINDAL FLYVEPLADS DN 5750 1021 28
File 2 berisi pengidentifikasi unik dalam File 1 dan yang kedua, pengidentifikasi 4 karakter (ICAO locator).
060100 EKVG
060220 EKGF
060240 EKTS
060300 EKYT
060340 EKSN
060480 EKHS
060540 EKHO
060600 EKKA
060620 EKSV
060660 EKVJ
060700 EKAH
060780 EKAT
Saya ingin bergabung dengan dua file, sehingga file yang dihasilkan akan memiliki pengidentifikasi 4 karakter dalam 4 posisi pertama di baris, yaitu pengidentifikasi harus mengganti 4 spasi.
060090 AKRABERG FYR DN 6138 -666 101
EKVG 060100 VAGA FLOGHAVN DN 6205 -728 88
060110 TORSHAVN DN 6201 -675 55
060120 KIRKJA DN 6231 -631 55
060130 KLAKSVIK HELIPORT DN 6221 -656 75
060160 HORNS REV A DN 5550 786 21
060170 HORNS REV B DN 5558 761 10
060190 SILSTRUP DN 5691 863 0
060210 HANSTHOLM DN 5711 858 0
EKGF 060220 TYRA OEST DN 5571 480 43
EKTS 060240 THISTED LUFTHAVN DN 5706 870 8
060290 GROENLANDSHAVNEN DN 5703 1005 0
EKYT 060300 FLYVESTATION AALBORG DN 5708 985 13
060310 TYLSTRUP DN 5718 995 0
060320 STENHOEJ DN 5736 1033 56
060330 HIRTSHALS DN 5758 995 0
EKSN 060340 SINDAL FLYVEPLADS DN 5750 1021 28
Apakah mungkin menyelesaikan tugas ini dengan skrip bash dan / atau awk?
sumber
Jawaban:
sumber
Beberapa dari kami ingin melihat apakah kami dapat menyelesaikan masalah ini
join
hanya dengan menggunakan . Ini adalah usaha saya untuk melakukan itu. Karena sebagian berfungsi @Terdon berhutang makan malam 8-).Perintah
Contoh
Detail
Di atas adalah memanfaatkan hampir semua opsi yang tersedia untuk
join
memberitahu saya bahwa kita menggunakannya salah, seperti dalam beberapa jenis cara Frankenstein, tapi kita semua belajar di sini, jadi tidak apa-apa ... Saya kira.Switch
-a1
memberitahu join untuk memasukkan baris apa pun yang tidak memiliki kecocokan yang sesuai dari file2 di file1. Jadi inilah yang mendorong garis-garis ini untuk ditampilkan:The
-1 1
dan-2 1
mengatakan yang kolom untuk bergabung dengan garis dari 2 file pada, terutama kolom 1 mereka. Yang-o ...
mengatakan kolom mana dari 2 file untuk ditampilkan dan dalam urutan mana.Kata
-e "N/A"
mengatakan untuk menggunakan string "N / A" sebagai nilai tempat penampung untuk mencetak untuk bidang yang dianggap kosong olehjoin
.2 argumen terakhir memberi makan 2 file,
file1
&file2
sebagaimana diurutkan ke dalam perintah bergabung.Mohon berbaik hati, karena ini adalah pekerjaan yang sedang berjalan dan kami berusaha menunjukkan bagaimana seseorang dapat memecahkan masalah jenis ini menggunakan
join
perintah, karena ini tampaknya merupakan jenis masalah yang dimaksudkan.Masalah luar biasa
Kolom ke-3
Yang utama adalah bagaimana bersaing dengan kolom ke-3 karena merupakan campuran dari 1 kata dan 2 nilai kata. Ini sepertinya penghalang utama bagi
join
saya dan saya tidak bisa mencari jalan keluar. Bimbingan apa pun akan dihargai.Jarak
Semua spasi asli hilang dengan
join
dan saya tidak melihat cara untuk tetap menggunakannya. Jadijoin
mungkin bukan cara yang tepat untuk menangani masalah-masalah seperti ini.Tampaknya bekerja?
Setelah banyak membengkokkan dengan baris perintah solusi umum ada sehingga ini sepertinya bisa bekerja setidaknya sebagian, sehingga ini dapat digunakan pada inti dari solusi, dan kemudian menggunakan alat-alat lain seperti
awk
dansed
untuk membersihkannya . Ini menimbulkan pertanyaan: "Jika Anda membersihkannya denganawk
&sed
cara apa pun, maka Anda mungkin hanya menggunakannya secara langsung?".sumber
join
jadi sekarang internet memiliki yang ini. 8-)Ini harus dimungkinkan menggunakan
join
tetapi saya tidak tahu cara membuatnya mencetak spasi dan bidang kosong dengan benar. Bagaimanapun, skrip Perl kecil ini akan melakukan trik:Simpan ini sebagai
foo.pl
dan jalankan sebagai berikut:sumber
-o
fitur sebelumnya, tidak berfungsi seperti yang saya harapkan.-o
dan-e
tetapi tidak bisa mencetak baris yang tidak ada entri di file2. Semoga beruntung, saya akan tertarik untuk mengetahui apakah itu mungkin.Bash akan melakukannya.
Lihat jawaban SO ini untuk perincian tentang apa yang terjadi dengan "hash" Bash 4 secara native mendukung array asosiatif, tetapi ini seharusnya bekerja dalam 3 + 4 (mungkin 2?)
Anda mungkin perlu memotong garis dari file1 untuk mendapatkan pemformatan.
sumber
Berikut cara mudah untuk melakukannya dengan
join
(+ beberapa alat lainnya) dan menjaga jaraknya. Kedua file tampaknya diurutkan berdasarkan nomor stasiun sehingga tidak diperlukan penyortiran tambahan:Bagian sebelum pipa sangat mirip dengan apa yang digunakan slm dalam jawabannya jadi saya tidak akan membahasnya lagi. Satu-satunya perbedaan adalah bahwa saya menggunakan
-e " "
- string empat spasi sebagai pengganti untuk bidang input yang hilang dan-o 2.2
hanya menghasilkan bidang ke-2 file2Jadi
join -j1 -a1 -o 2.2 -e " " file1 file2
menghasilkan kolom empat-char-lebar (tidak terlihat di bawah tetapi tidak ada setelah EK ** dan baris kosong sebenarnya adalah empat spasi):kita kemudian
paste
ini (menggunakan spasi sebagai pembatas) ke file1 dari mana kitacut
5 karakter pertama| paste -d' ' - <(cut -c6- file1)
hasil akhir:
sumber