Да, вы можете сделать это с помощью 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"
: это просто печатает последний перевод строки.