AWK: заменить и записать значение столбца во входной файл - PullRequest
12 голосов
/ 14 марта 2012

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

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 14 марта 2012

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

$ 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 голосов
/ 14 марта 2012
awk 'BEGIN {FS="\t"} {if($3 > 100) $3=$3/100;print}' test.stat > /tmp/tmp.stat && mv /tmp/tmp.stat test.stat

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

2 голосов
/ 14 марта 2012

Чтобы сделать вашу команду более похожей на 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
2 голосов
/ 14 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...