одна строка с использованием sed и bc вместе?

Я хочу добавить единицу к последнему значению в конце строки в sed. Я думаю в том же духе

cat 0809_data.csv |sed -e 's/\([0-9]\{6\}\).*\(,[^,]*$\)/\1\2/g'| export YEARS = $(echo `grep -o '[^,]*$' + 1`|bc)

например 123456, kjhsflk, lksjgrlks, 2.8 -> 123456, 3.8

Будет ли это более разумным/выполнимым в awk?


person d-cubed    schedule 31.05.2010    source источник


Ответы (1)


Это должно работать:

years=$(awk -F, 'BEGIN{ OFS=", "} {print $1, $4+1}' 0809_data.csv)

Было бы очень неудобно пытаться использовать sed и выполнять арифметические действия с частью результата. Вам придется разорвать веревку, посчитать и собрать все обратно. AWK делает это аккуратно, без суеты.

Обратите внимание, что cat не требуется (даже с использованием sed в команде, аналогичной той, что указана в вашем вопросе), и, вероятно, нет необходимости экспортировать переменную, если только вы не вызываете другой скрипт и не нуждаетесь в том, чтобы он мог получить к нему доступ как к «глобальному " переменная. Кроме того, оболочки обычно выполняют целочисленные вычисления, поэтому вам не нужно использовать bc, если вам не нужны числа с плавающей запятой.

person Dennis Williamson    schedule 31.05.2010
comment
Это выглядит великолепно. Спасибо. cat only_0809__data.csv |sed -e 's/([0-9]\{6\}).*(,[^,]*$)/\1\2/g' |awk 'НАЧАТЬ {FS=, }{OFS=, }{напечатать $1,$2+1} - person d-cubed; 31.05.2010
comment
@Donnied: OFS должен быть внутри первого набора фигурных скобок (тех, которые принадлежат BEGIN), поэтому он выполняется только один раз, а не в каждой строке. Нет необходимости использовать cat. Вы можете делать регулярные выражения в том же вызове AWK, возможно, используя gsub вместо использования sed. - person Dennis Williamson; 31.05.2010