2014-01-09 3 views
0

У меня есть следующий фрагмент кода:Как заменить строку с помощью awk в unix?

v=`date "+%Y%m%d"` 
awk -F, '{$2=$v;}1' OFS=, test.txt > test2.txt 

где test.txt мой входной файл и test2.txt выходной файл.

Линии test1.txt соблюдать следующий формат: Unix,10,A

Когда я исполняю выше сценарий, он удваивает первое и последнее слово из test.txt

ответ

0

Как это

awk -F, '{$2=v;}1' OFS=, v=`date "+%Y%m%d"` file 
Unix,20140109,A 

You не следует читать переменную внутри awk
Назначьте их сначала, десять используйте их.

v=`date "+%Y%m%d"` 
awk -F, '{$2=var;}1' OFS=, var="$v" file 
0

Если намерение состоит в том, чтобы заменить второе поле со значением в $v, вам нужно будет пройти в значении для Awk каким-то образом. Как отдельный процесс, Awk не знает о внутренних переменных оболочки.

awk -F, -v v="$v" '{$2=v}1' OFS=, test.txt > test2.txt 

Обратите также внимание, что имя переменной Awk является просто v. Для Awk $v означает поле ввода, число которого находится в переменной v.

-1

Я рекомендовал бы неофициальный унаследованный синтаксис здесь:

v=$(date "+%Y%m%d") 

, то вы можете использовать любого из этих awk заклятий:

awk -F, -v v="$v" '{$2=v}1' OFS=, test.txt > test2.txt 
awk -F, '{$2=v}1' OFS=, v="$v" test.txt > test2.txt 
awk -F, '{$2="'$v'"}1' OFS=, test.txt > test2.txt 

В качестве альтернативы, если вам не нужен переменная v позже кожух, вы можете запустить команду date изнутри awk либо с:

awk -F, 'BEGIN{"date \"+%Y%m%d\""|getline v}{$2=v}1' OFS=, test.txt > test2.txt 

или

awk -F, 'BEGIN{v="'$(date "+%Y%m%d")'"}{$2=v}1' OFS=, test.txt > test2.txt 

или неэффективное

awk -F, '{$2="'$(date "+%Y%m%d")'"}1' OFS=, test.txt > test2.txt 
Смежные вопросы