Использовать Sed.
Обратите внимание, что вы не будете использовать 0 индексированных позиций, а начнете с 1. Итак, я увеличил числа, которые вы указали.
Кроме того, вам нужно вернуться на передний план, поскольку после изменения первого столбца позиции столбцов изменяются. Поэтому используйте Sed следующим образом:
sed 's/./&,/6;s/./&,/4;s/./&,/3'
Пример:
$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$
s
в Sed предназначена для подстановки. .
соответствует любому одиночному символу. &
в тексте замены означает «текст, который был найден», а запятая - это буквальная запятая. /
означает выполнение замены только в «n-м» совпадении в строке. Если вы хотите быть действительно фантастическим, используйте расширение скобок Bash для создания команд Sed:
$ echo dxccsbc | sed '-es/./&,/'{6,4,3}
dxc,c,sb,c
Но это просто вишенка на торте и, вероятно, сбивает с толку, если вы не понимаете как Sed, так и Bash достаточно хорошо. :)
Если вы хотите получить список позиций из отдельного файла (как вы на самом деле показываете в своем вопросе), вы можете сделать это так:
sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
Обратите внимание, что это специфично для Bash, поскольку он использует синтаксис замены процесса, отличный от POSIX. Также обратите внимание, что я сделал это довольно надежным, поскольку все, кроме фактических чисел в файле позиций (которые не начинаются с 0), будут отброшены.
Результаты тестирования:
$ cat file
abcdefg
ABCDEFG
abcdelaksjdflkjsdflli
sdlfihsdlfkj
$ cat positionsfile
2
15
5
7something
01
not a number
$ sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
ab,cde,fg
AB,CDE,FG
ab,cde,laksjdflkj,sdflli
sd,lfi,hsdlfkj
$
Это зависит от буферов ОС и времени между 10-й и 11-й записью dmesg
.
После того, как head
запишет 10 строк, он завершится, и dmesg
получит сигнал SIGPIPE , если он продолжит запись в конвейер.
В зависимости от буфера вашей ОС, dmesg
часто будет записывать более 10 строк, прежде чем head
поглотит их.
Чтобы увидеть, что head
занял более 10 строк, вы можете использовать:
strace -f sh -c 'dmesg | head -n 10'
(Посмотрите на процесс head
, посчитайте количество прочитанных
] системные вызовы.)
Чтобы увидеть, как влияет скорость записи:
strace -f sh -c "perl -le '$|++;print 1 while 1' | head -n 10"