我有以下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作为第一列。不幸的是,这不起作用,我收到消息: ^反斜杠不是行上的最后一个字符。 它可能与我如何逃脱$字符有关,但我不知道怎么做...任何想法?
答案 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 \”