Да, вы можете сделать это с помощью 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"
: это просто печатает последний перевод строки.
С awk:
или с bash:
Выход:
источник
Ну, вы можете сделать это в Sed, но Python работает также.
Содержимое таково
reformatfile.py
:Как это работает? Там действительно ничего особенного не происходит. Мы открываем первый аргумент командной строки как файл для чтения и переходим к разбивке каждой строки на «слова» или отдельные элементы. Первые слова становятся
pref
переменными, и мы печатаем второй элемент (слова [1]), заканчивающийся пробелом. Затем мы создаем новый набор «слов» через списочные выражения и работаем.join()
с временным списком преф, каждого слова и строки"1"
. Последний шаг - распечатать ихисточник
С
awk
:Это все о форматировании разделенных пробелами полей в желаемом формате:
printf("%s ", $2)
печатает второе поле с пробеломfor(i=3; i<NF; i++) printf("%s:%s:1 ", $1, $i)
перебирает последние 3–2 поля и печатает поля в нужном формате (первое поле, затем двоеточие, затем текущее поле, затем двоеточие, наконец 1) с завершающим пробеломprintf("%s:%s:1\n", $1, $NF)
печатает последнее поле с новой строкойПример:
источник