Можна це зробити за допомогою 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; надрукує друге поле та пробіл.
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-е поле, a :, потім поточне поле та a :1.
print "\n" : це просто друкує остаточний новий рядок.