awk: использование escape-символов в выражении - PullRequest
0 голосов
/ 22 марта 2012

У меня есть следующая команда awk, которая отлично работает:

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

Он вставляет два столбца: значение 22 в качестве первого и номер строки в качестве третьего (см. этот вопрос ). Я попытался запустить эту команду в цикле for следующим образом:

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 ]

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

Вы в правильном направлении.Поскольку ваш сценарий awk находится внутри '(одинарные кавычки), bash не заменяет значение $ p на его значение в сценарии (см. Руководство по расширенному написанию сценариев Bash - цитирование).Вам необходимо выполнить одно из следующих действий: 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 экранировать «от \»

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

Вы можете назначить параметр оболочки для 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
...