Вы можете сделать это с помощью awk
следующим образом:
awk -F\| 'BEGIN {OFS="|"};{$12=substr($12,1,5)};1'
-F
устанавливает разделитель полей на |
, то перед началом обработки текста мы используем блок BEGIN
, чтобы также установить разделитель выходных полей ( OFS
) на |
. Затем мы заменяем значение в 12-м поле первыми 5 символами этого поля для каждой записи.
Вы можете указать имя файла для обработки в качестве другого аргумента в командной строке, что вы, вероятно, захотите, или использовать это в конвейере, если у вас есть процесс, который генерирует файл, который вы хотите обновить.
Спасибо Stéphane Chazelas за исправление некоторых проблем, которые у меня были, и за то, что он сделал его более подходящим для POSIX. В частности, для исправления моего начального индекса от 0 до 1. Документация GNU включает следующую строку, которая позволила мне избавиться от ошибки:
Если start меньше единицы, substr () рассматривает ее как единицу.
, но 1
- это индекс первого символа, поэтому его следует использовать, особенно для людей, не использующих gawk
. Например, с mawk
:
$ mawk 'BEGIN{print substr("1234567", 0, 5)}'
1234
$ mawk 'BEGIN{print substr("1234567", 1, 5)}'
12345
Я нашел проблему и решение своей проблемы, просмотрев dmesg :Я обнаружил, что была «Внутренняя ошибка :Упс :817 [ #1] ARM», вызванная пользовательским ядром функция в файле proc. Файл proc был прочитан основным потоком процесса, ставшего зомби, и иногда эта операция приводила к гибели основного потока... Это в точности похоже на ответ @muru. Я исправил функцию, и теперь процесс больше не умирает. Все равно спасибо всем.
Процесс-зомби — это процесс, который завершился, но все еще имеет запись в таблице процессов, потому что, например, его потомки еще живы (см. Википедию).
Итак, если, как вы говорите, ни один из B, C и D не мертв, а A завершает выполнение, он станет зомби до тех пор, пока все B, C и D также не закончат выполнение.
Это нормальное поведение.
Так что это выглядит как ошибка в A. :Он не должен умирать, пока его потомки живы, потому что он должен следить за потомками. Исправьте ошибку в A и не беспокойтесь о том, что она превратится в зомби.
Если вы используете pthread_exit()
в функции main()
, этот пост SO предполагает, что основной поток может войти в состояние зомби, но другие потоки продолжают работать. Поскольку вызов pthread_exit()
в main()
совершенно законен, я полагаю, что это нормальное положение дел, и эта конкретная нежить безвредна. Вы можете игнорировать его или ждать других потоков в main()
вместо использования там pthread_exit()
.