2012-03-22 3 views
0

У меня есть следующая команда AWK, которая работает отлично:AWK: использование экранирующих символов в для заявления

awk 'BEGIN { ORS = " " } {print 22, $1, NR; for(i=2;i<=NF;++i) print $i}{print "\n"}' file 

Что она делает это вставить два столбца: значение 22, как первый, и номер факса в строке, третий (см. this question). Я попытался запустить эту команду в цикле следующим образом:

for p in 20 21 22 
do 
awk 'BEGIN { ORS = " " } {print $p, \$1, NR; for(i=2;i<=NF;++i) print \$i}{print "\n"}' file > file$p 
done 

Так вместо 22 в первом столбце, 3 файла сделаны где каждый файл имеет 20, 21 или 22 в качестве первого столбца. К сожалению, это не работает, и я получаю сообщение: ^обратный слэш не последний символ в строке. Возможно, это связано с тем, как я избежал $ символов, но я не знаю, как это сделать ... любые идеи?

ответ

2

Вы можете назначить оболочки-параметр для AWK с помощью

-v parameter=value 

т.е. использовать

awk -v p=$p ... 

Как это:

for p in 20 21 22 
do 
awk -v p=$p 'BEGIN { ORS = " " } [TOO LONG LINE]' file > file$p 
done 

Полный команду:

for p in 20 21 22; do awk -v p=$p 'BEGIN { ORS = " " } {print p, $1, NR; for(i=2;i<=NF;++i) print $i}{print "\n"}' file > file$p; done 
2

Вы находитесь в правильном направлении. Поскольку ваш awk-скрипт находится внутри '(одинарные кавычки), bash не заменяет $ p своим значением в скрипте (см. Расширенное руководство Bash-Scripting Guide - Quoting). Вам необходимо выполнить одно из следующих действий: 1 (рекоммендуется):

for p in 20 21 22 
do 
awk -v p=$p 'BEGIN { ORS = " " } {print p, \$1, NR; for(i=2;i<=NF;++i) print \$i}{print "\n"}' file > file$p 
done 

2: Использование "вместо" и в AWK избежала "от \"

+0

не избежать '$ 'в awk-скрипте. –

Смежные вопросы