Я не вижу никаких признаков в вашем вопросе, что ваш файл действительно имеет большой размер, так как 2000000 строк - это ничто, и каждая строка сэмпла в вашем вопросе мала, поэтому есть вероятность, что это все, что вам нужно:
awk '
/data for AAA/ { $2 = "bla_AAA"; next }
/data for BBB/ { $2 = "bla_BBB"; next }
' file > tmp && mv tmp file
GNU awk имеет опцию -i inplace
для того же типа редактирования "на месте", что и sed, perl и т. Д. (Т. Е. Для внутреннего использования файла tmp).
Если вы действительно этого не сделалиу вас недостаточно места для создания копии входного файла, тогда вы можете использовать что-то вроде этого (не проверено!):
headLines=10000
beg=1
tmp=$(mktemp) || exit 1
while -s file; do
head -n "$headLines" file | awk 'above script' >> "$tmp" &&
headBytes=$(head -n "$headLines" file |wc -c) &&
dd if=file bs="$headBytes" skip=1 conv=notrunc of=file &&
truncate -s "-$headBytes" file
rslt=$?
done
(( rslt == 0 )) && mv "$tmp" file
, поэтому вы никогда не используете больше памяти, чем размер вашего входного файла, плюсheadLines
строк (массируйте это число, чтобы удовлетворить).См. https://stackoverflow.com/a/17331179/1745001 для получения информации о том, что truncate
и 2 строки перед этим делают.