awk:在for语句中使用转义字符

时间:2012-03-22 12:44:27

标签: for-loop escaping awk

我有以下awk命令可以完美运行:

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

它做的是插入两列:值22作为第一列,行的nr作为第三列(参见this question)。 我尝试在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 个答案:

答案 0 :(得分:2)

您可以使用

将shell参数分配给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

答案 1 :(得分:2)

你的方向正确。因为你的awk脚本在'(单引号)中,所以bash不会将$ p替换为脚本中的值(参见Advanced 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中逃避“by \”