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.
Dengan awk:
atau dengan bash:
Keluaran:
sumber
Nah, Anda bisa melakukannya dengan sed, tetapi python juga berfungsi.
Isi is
reformatfile.py
sebagai:Bagaimana cara kerjanya? Tidak ada yang istimewa yang terjadi. Kami membuka argumen baris perintah pertama sebagai file untuk dibaca dan melanjutkan dengan memecah setiap baris menjadi "kata" atau item individual. Kata pertama menjadi
pref
variabel, dan kami mencetak item stdout kedua (kata [1]) yang diakhiri dengan spasi. Selanjutnya kita membangun set baru "kata-kata" melalui pemahaman daftar dan.join()
fungsi pada daftar sementara pref, setiap kata, dan string"1"
. Langkah terakhir adalah mencetaknyasumber
Dengan
awk
:Ini semua tentang memformat bidang yang dipisahkan ruang dalam format yang diinginkan:
printf("%s ", $2)
mencetak bidang kedua dengan spasi tambahanfor(i=3; i<NF; i++) printf("%s:%s:1 ", $1, $i)
beralih ke bidang terakhir ke 3 dan kedua dan mencetak bidang dalam format yang diinginkan (bidang pertama, lalu titik dua, lalu bidang saat ini, lalu titik dua, akhirnya 1) dengan spasi tambahanprintf("%s:%s:1\n", $1, $NF)
mencetak bidang terakhir dengan baris baruContoh:
sumber