Измените значение столбца с помощью gsub - PullRequest
0 голосов
/ 06 марта 2019

Мне нужно изменить все значения первого столбца файла (за исключением заголовка) с помощью команды unix.

Я пытаюсь сделать следующее, но кажется, что все мои файлы удаляются:

awk -F\| -v val="20190306" '{gsub($1,val); print}' file > file

Кроме того, 20190306 обычно является переменной, которую я заменил примером значения.Я хотел бы иметь возможность поместить эту переменную в формате даты, например 2019-03-06 вместо 20190306.

Мой ввод:

Value_date; CPTY 2018-10-17;INVEST 2018-10-17;USD

Вывод, который я хочу:

Value_date; CPTY 2019-03-06;INVEST 2019-03-06;USD

Моя версия awk: 3.1.7

Ответы [ 2 ]

2 голосов
/ 06 марта 2019
awk -F\| -v val="20190306" '{gsub($1,val); print}' file > file
# ......................................................^^^^^^

Ваш файл обрезается до нулевой длины до того, как команда awk даже запустится.Затем оболочка обрабатывает перенаправления first .

Вам необходимо вывести временный файл, а затем переместить временный файл в исходный , если команда awk прошла успешно:

tmp=$(mktemp)
awk ... file > "$tmp" && mv "$tmp" file

Существуют и другие методы, которые вы можете использовать:

  • установите пакет moreutils, затем awk ... file | sponge file
0 голосов
/ 06 марта 2019

Вы ввели нас в заблуждение своим собственным кодом, а не примерами ввода и вывода ...
Основываясь на входе и выходе, которые вы показали в комментариях, я считаю, что лучше использовать sed:

val='20190306'
sed -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/'"${val:0:4}-${val:4:2}-${val:6:2}"'/g' file

Или в этом случае эта работа тоже:

sed -e "s/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/${val:0:4}-${val:4:2}-${val:6:2}/g" file

Если вывод выглядит нормально, добавьте переключатель -i (sed -i -e ...), чтобы изменить файл на месте.

Если вы хотите использовать awk:

awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file

Но поскольку у вас нет GNU awk v4.1.0+, вы не можете использовать -i inplace для изменения на месте.
Вы можете попробовать:

awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file | tee file

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

awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file > temp_file
mv -f temp_file file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...