2012-03-22 107 views
0

我有以下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

您可以指定一個shell參數使用

-v parameter=value 

到的awk即使用

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腳本指南 - 引用)。 你需要做以下之一: 1(Recommened):

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腳本中。 – 2012-03-22 14:25:51