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