Bunu sed ile yapabilirsiniz, evet, ancak diğer araçlar daha basittir. Örneğin:
$ 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
açıklama
awk olarak her alanlar tasarrufu (varsayılan olarak) boşluk üzerinde girişin her satırı bölecek $1, $2, $N. Yani:
printf "%s ", $2; 2. alanı ve sondaki alanı yazdırır.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }: alanlar 3 üzerinden son alana ( NFalan sayısıdır) yinelenir ve her biri için 1. alanı, a :, ardından geçerli alanı ve a'yı yazdırır :1.
print "" : bu sadece son bir satırsonu yazdırır.
Veya 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
açıklama
-aMarkaları perlgibi davranır awkve boşluk üzerindeki girişini bölün. Burada, alanlar dizide saklanır @F, yani 1. alan $F[0], 2. $F[1]vb.
print "$F[1] " : 2. alanı yazdırın.
print "$F[0]:$_:1 " for @F[2..$#F];: alan 3'ü son alana yineleyin ( $#Fdizideki öğelerin sayısıdır @F, bu nedenle @F[2..$#F]dizinin sonuna kadar 3. öğeden başlayarak bir dizi dilimi alır) ve 1. alanı, a :, ardından geçerli alanı ve bir :1.
print "\n" : bu sadece son bir satırsonu yazdırır.