Подтвердить что ты не робот

AWK: заменить и записать значение столбца во входном файле

Я пытаюсь заменить значения столбца $3 входного файла, если $3 > 100. Я пробовал:

awk 'BEGIN {FS="\t"} {if($3 > 100) $3=$3/100;print}' test.stat

Это выводит правильные изменения в stdout, но мне нужно изменение для записи во входной файл (test.stat), так что значения остальных полей/записей остаются неизменными. Любое предложение?

Спасибо. Возникла еще одна проблема. Я имею переменную "счетчик", чья сумма должна быть напечатана в блоке END, я пробовал:

awk 'BEGIN {FS="\t",counter=0} 
{if($3 > 100) $3=$3/100;print else counter++}
END{print counter}' test.stat > ...

Теперь в файл записывается только значение счетчика, а не значения $3. Как я могу отделить два выхода, чтобы один из них изменял файл, а другой - как переменную bash, используя команду чтения. Спасибо.

4b9b3361

Ответ 1

Awk не предназначен для редактирования вещей на месте. Он предназначен для обработки данных и записи их в stdout (или другой файл). Вы можете сделать что-то вроде этого:

$ awk 'BEGIN {FS="\t"} {if($3 > 100) $3=$3/100;print}' test.stat > test.stat.new \
    && mv test.stat test.stat.old && mv test.stat.new test.stat

Ответ 2

Насколько я знаю, awk не имеет редактирования на месте, поскольку sed делает (через переключатель -i).

Простым решением, конечно же, является использование временного файла и последующая перезапись исходного файла. Это решение рекомендуется даже в comp.lang.awk.

Более сложное решение - сохранить изменения в массиве awk и добавить блок END, который выгружает содержимое массива в исходный файл.

Ответ 3

Чтобы сделать вашу команду более awk-подобной:

awk -F '\t' '$3 > 100 {$3 = $3/100} {print}' test.stat

Чтобы перезаписать файл, вам необходимо записать во временный файл

f=$(mktemp)
cp test.stat test.stat.bak$(date +%s)  ;# if you want a backup copy
awk '...' test.stat > "$f" && mv "$f" test.stat

Ответ 4

awk 'BEGIN {FS="\t"} {if($3 > 100) $3=$3/100;print}' test.stat > /tmp/tmp.stat && mv /tmp/tmp.stat test.stat

это должно работать