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 ( NF
adalah 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 -a
merek perl
berperilaku seperti awk
dan 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 ( $#F
adalah 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.