Bagaimana saya dapat menggunakan awk
dalam situasi berikut?
Saya ingin menyatukan garis yang dimulai dengan kolom yang sama. Hanya kolom pertama disimpan setelah bergabung (dalam hal ini aaa
, www
, hhh
).
File mungkin dipisahkan oleh spasi atau tab.
Input contoh:
aaa bbb ccc ddd NULL NULL NULL
aaa NULL NULL NULL NULL NULL NULL
aaa bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy
hhh 111 333 yyy ooo hyy NULL
Output yang diinginkan:
aaa bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL
Latar belakangnya adalah saya ingin membuat basis data berbasis file yang sangat sederhana, di mana kolom pertama selalu merupakan pengidentifikasi untuk entitas. Semua baris berdasarkan kolom pengidentifikasi yang sama digabungkan.
text-processing
sed
awk
mungil
sumber
sumber
uuu
asal (dalam output)?Jawaban:
Untuk mendapatkan kolom pertama di setiap baris menggunakan awk, Anda dapat melakukan hal berikut:
Ini adalah kunci Anda untuk sisa baris. Jadi, Anda dapat membuat tabel hash, menggunakan kolom pertama sebagai kunci dan kolom kedua dari baris sebagai nilainya:
Untuk mendapatkan seluruh baris, dimulai dengan kolom 2, Anda harus mengumpulkan semua kolom:
sumber
Orang lain dapat menjawab dengan awk atau sed, tetapi versi Python mudah dan mungkin membantu Anda.
sumber
Ini lebih merupakan aplikasi coreutils yang menarik, saya kira itu tidak sangat efisien dengan input besar karena ia memanggil join untuk setiap baris dalam input.
Untuk meningkatkan efisiensi, menabung
outfile
dantmp
ramdisk mungkin membantu.Edit
Atau tanpa file sementara:
sumber
Dan inilah PERL one-liner:
sumber