Да, вы можете сделать это с помощью sed, но другие инструменты проще. Например:
$ 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
объяснение
AWK разделит каждую строку ввода на пробельном (по умолчанию), экономя каждое поле , как $1, $2, $N. Так:
printf "%s ", $2; напечатает 2-е поле и завершающий пробел.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }: перебирает поля 3 до последнего поля ( NFэто число полей) и для каждого из них выводит 1-е поле a :, затем текущее поле и a :1.
print "" : это просто печатает последний перевод строки.
Или 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марке perlведет себя как awkи разделить его вход на пробельном. Здесь поля хранятся в массиве @F, что означает, что первое поле будет $F[0], второе $F[1]и т. Д. Итак:
print "$F[1] " : напечатать 2-е поле.
print "$F[0]:$_:1 " for @F[2..$#F];: перебрать поля 3 до последнего поля ( $#Fэто количество элементов в массиве @F, поэтому @F[2..$#F]принимает срез массива, начиная с 3-го элемента до конца массива) и печатать 1-е поле, а :, затем текущее поле и :1,
print "\n" : это просто печатает последний перевод строки.