首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash shell脚本中出现Awk错误

bash shell脚本中出现Awk错误
EN

Stack Overflow用户
提问于 2017-03-06 01:32:45
回答 1查看 554关注 0票数 0

我正在尝试根据另一个文件的顺序对一个两列文件进行排序。使用以下命令:

代码语言:javascript
复制
  awk  'FNR == NR {lineno[$1] = NR; next} {print lineno[$1], $0;}'  associativity4Way_cacheSize32KB_replacementPolicy1.outs  associativity4Way_cacheSize32KB_replacementPolicy2.outs   | sort -k  1,1n  | cut -d " " -f2- > sorted

当我在shell外使用AWK命令时,它工作得很好。下面是我的文件的头部内容和输出:

这是"associativity4Way_cacheSize32KB_replacementPolicy2.outs的头“

代码语言:javascript
复制
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c32  4.516192
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c32  4.147467
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c64  2.040121
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c64  1.837639
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c64  3.068701
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c32  0.474358
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c32  0.545525
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c32  0.469907
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c64  0.19461
...

这是"ssociativity4Way_cacheSize32KB_replacementPolicy1.outs“

代码语言:javascript
复制
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.869599
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.100611
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.068284
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  28.559002
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 21.332859
SHORT_MOBILE-22.bt9.trace.gz_a4_b64_c32 20.605805
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.256246
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.193713
SHORT_MOBILE-22.bt9.trace.gz_a4_b64_c32 20.119883
SHORT_MOBILE-22.bt9.trace.gz_a4_b64_c32 20.099358
...

输出如我所愿进行了完美的排序:

代码语言:javascript
复制
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  28.559002
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.068284
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.100611
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.869599
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.193713
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.256246
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 21.332859
...

当我尝试将awk命令放在我的bash脚本中以便能够对其他文件执行此操作时,出现了问题:

代码语言:javascript
复制
set lru = "associativity${a}Way_cacheSize${c}KB_replacementPolicy1.outs"


set policy = "associativity${a}Way_cacheSize${c}KB_replacementPolicy${r}.outs"


awk  "FNR == NR {lineno["$policy"] = NR; next} {print lineno["$policy"], "$lru";}" "$lru" "$policy" | sort -k 1,1n  | cut -d " " -f2- > "${policy}_sorted"

这是我得到的错误:

代码语言:javascript
复制
awk: cmd. line:1: FNR == NR {lineno[associativity4Way_cacheSize32KB_replacementPolicy3.outs] = NR; next} {print lineno[associativity4Way_cacheSize32KB_replacementPolicy3.outs], associativity4Way_cacheSize32KB_replacementPolicy1.outs;}
awk: cmd. line:1:                                                                                                                                                                                                                  ^ syntax error

我也试过了(这里有一个答案建议),但输出不正确。它在输出文件中多次打印'lru‘文件的名称。

代码语言:javascript
复制
set lru = "associativity${a}Way_cacheSize${c}KB_replacementPolicy1.outs"
            set policy = "associativity${a}Way_cacheSize${c}KB_replacementPolicy${r}.outs"
            awk -v policy="$policy" -v lru="$lru" 'FNR == NR {lineno[policy] = NR; next} {print lineno[policy], lru}' "$lru" "$policy"  | sort -k 1,1n  | cut -d ' ' -f2- > "${policy}_sorted"


 associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs

有人能告诉我这里哪里错了吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-06 03:00:24

切勿用双引号将任何脚本(awk sed,诸如此类)括起来,因为这只会带来复杂性和脆弱性。

更改此设置:

代码语言:javascript
复制
awk "FNR == NR {lineno["$policy"] = NR; next} {print lineno["$policy"], "$lru";}" "$lru" "$policy"

要这样做:

代码语言:javascript
复制
awk -v policy="$policy" -v lru="$lru" 'FNR == NR {lineno[policy] = NR; next} {print lineno[policy], lru}' "$lru" "$policy"

看看它是如何发展的。获取Arnold Robbins的《Effective awk Programming》一书,第四版,开始了解Awk。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42611651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档