Anda bisa melakukannya dengan sed, ya, tetapi alat lain lebih sederhana. Sebagai contoh:
$ awk '{
printf "%s ", $2;
for(i=3;i<=NF;i++){
printf "%s:%s:1 ",$1,$(i)
}
print ""
}' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Penjelasan
awk akan membagi setiap baris masukan pada spasi (secara default), tabungan masing-masing bidang sebagai $1, $2, $N. Begitu:
printf "%s ", $2; akan mencetak bidang ke-2 dan spasi tambahan.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }: akan beralih di atas bidang 3 ke bidang terakhir ( NFadalah jumlah bidang) dan untuk masing-masing bidang itu akan mencetak bidang ke-1, a: , kemudian bidang saat ini dan a :1.
print "" : ini hanya mencetak baris terakhir.
Atau Perl:
$ perl -ane 'print "$F[1] "; print "$F[0]:$_:1 " for @F[2..$#F]; print "\n"' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Penjelasan
The -amerek perlberperilaku seperti awkdan membagi masukan pada spasi. Di sini, bidang disimpan dalam array @F, artinya bidang ke-1 akan $F[0], ke-2, $F[1]dll. Jadi:
print "$F[1] " : cetak bidang ke-2.
print "$F[0]:$_:1 " for @F[2..$#F];: iterate over field 3 ke bidang terakhir ( $#Fadalah jumlah elemen dalam array @F, jadi @F[2..$#F]ambil irisan array mulai dari elemen ke-3 sampai akhir array) dan cetak bidang 1, a :, lalu bidang saat ini dan :1.
print "\n" : ini hanya mencetak baris terakhir.