Я бы использовал awk
:
$ awk 'NR>1{$1=$1"_i1"}1;' test.txt
A1A A1B A1C A1D A1E
TR6764_c0_g2_i1 0.00 0.02 0.00 0.00 0.00
TR25644_c0_g1_i1 0.00 0.00 0.00 0.00 0.00
TR4897_c0_g1_i1 58.50 177.26 130.35 8.52 102.66
TR900_c0_g2_i1 0.00 0.00 0.00 0.00 0.00
Или, если вам нужно сохранить пробелы неизменными, perl:
$ perl -pe 's/\s/_i1$&/ if $.>1' test.txt
A1A A1B A1C A1D A1E
TR6764_c0_g2_i1 0.00 0.02 0.00 0.00 0.00
TR25644_c0_g1_i1 0.00 0.00 0.00 0.00 0.00
TR4897_c0_g1_i1 58.50 177.26 130.35 8.52 102.66
TR900_c0_g2_i1 0.00 0.00 0.00 0.00 0.00
Это своего рода хакерский / необычный ответ, факт в том, что это, скорее всего, возможно не очень чистым способом.
grep
, похоже, печатает вывод только тогда, когда он встречает символ новой строки, ваш индикатор выполнения, вероятно, не вводит символ новой строки при обновлении, следовательно, ваша проблема.
strace
- это инструмент, используемый для просмотра системных вызовов, вызываемых командой, включая такие вещи, как чтение и запись в память / хранилище, а также такие вещи, как открытие / закрытие файловых дескрипторов.
С помощью strace
вы можете видеть, к какому процессу обращается процесс, в случае вашего канала stout
передается в grep
, поэтому с помощью strace
вы можете просмотреть текст, который передается в grep
. strace
будет регулярно отправлять вывод, поступающий из конвейерной команды, и вы можете прослушать этот вывод и отобразить его. Я тестировал с помощью rsync --progress
, что похоже на аналогичный сценарий. Я использовал grep
на ##%
, потому что это то, что rsync
использует для отображения прогресса.
rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%"
Если вы запустите эту команду, вы обнаружите, что strace
не дает хороших результатов, но когда я использовал его strace
поймал пару прочитанных
] s из rsync
, что grep
обычно не записывает
, показывая read
s для 0%, 21%, 45%, 68 %, 91% и 100%, казалось, обновлялись каждую секунду (вероятно, в зависимости от того, как часто rsync
обновляет прогресс).
Таким образом, вы можете grep
вывод strace
, что не очень хорошо, снова вызвав тот же grep
.
rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%" 2>&1 > /dev/null | grep -o "[0-9]*%"
2> & 1
важен, потому что strace
печатается на stderr
. > / dev / null
перенаправляет stdout
на / dev / null
, чтобы предотвратить вывод первого сообщения grep
. Конечным результатом этого был следующий результат:
0%
21%
45%
68%
91%
100%
Вам придется заменить grep
, но похоже, что это поможет. Это некрасиво, но работает и работает в обход ограничений grep
. Похоже, grep -f
, который работает как tail -f
, будет удобен (я знаю, что grep -f
уже используется).
Первый grep
в основном предназначен для фильтрации текста, который strace
будет прочитан
, поскольку в будут перечислены только совпадающие строки. ] strace
s читает
вызовы, но вам также нужно что-то для перемещения текста, чтобы strace
мог его смотреть.
Я подробно останавливаюсь на ответе Сантимана, поскольку окончательный ответ довольно сложен.
Это уже было довольно хакерским ... теперь оно стало действительно дерьмовым:
make flash \
|& strace -e trace=read grep -e "^\." -e rror \
|& stdbuf -o0 sed -ne 's/^.*"\.".*/\./p;/rror/p' \
| stdbuf -o0 tr -d '\n' \
; echo
Итак, make flash
выше вызывает openocd
;
strace
использует Уловка Centimane, описанная выше:
sed
заменить read (0, ".", Xxx)
строк на одинарные .
;
tr
сохраняет все .
в одной строке, а final echo помещает единственный EOL.
В дополнение к этому, sed
и tr
вызываются с помощью stdbuf -o0
, который устанавливает размер буфера стандартного вывода равным 0 (поскольку EOL удален), и grep / sed
также сопоставляют (e) rror
для вывода мусора в случае ошибки.
Я попытался свести все это раздувание к минимуму, но не смог.
Также обратите внимание, что я использую zsh / Ubuntu 14.04, и я не уверен, что это может работать в других Unix.