2017-03-05 95 views
0

我想根据另一个文件的顺序对两列文件进行排序。使用以下命令:bash shell脚本中的awk错误

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 

当我在外壳上使用AWK命令时,它工作正常。下面是我的文件头内容和输出:

这是“associativity4Way_cacheSize32KB_replacementPolicy2.outs”

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”

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 
... 

输出排序完美如我所愿:

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 
... 

T他的问题出现时,我尝试把awk命令我bash脚本里面能够做到这一点的其他文件:

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" 

这是错误我得到:

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'文件的名称。

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 

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

+0

您是否尝试设置文件的完整路径? –

+1

使用编辑器的{}}按钮编辑您的问题,以正确地格式化您的代码,以便我们知道您的代码的真实外观。空白区域在awk脚本中很重要。 –

+0

@James:是的,我也尝试了完整的路径。仍然是同样的问题。 – samira

回答

2

切勿将任何脚本(awk sed,whatever)括在双引号中,因为它只会引入复杂性和易碎性。

更改此:

awk "FNR == NR {lineno["$policy"] = NR; next} {print lineno["$policy"], "$lru";}" "$lru" "$policy" 

这样:

awk -v policy="$policy" -v lru="$lru" 'FNR == NR {lineno[policy] = NR; next} {print lineno[policy], lru}' "$lru" "$policy" 

,看看它是如何去。获取由Arnold Robbins撰写的“有效的Awk编程”第4版,开始学习awk。

+0

谢谢,这个错误解决了。但是输出很奇怪。现在它将在输出文件中打印lru'文件的名称而不是我的数据。 '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;下一步} {print lineno [policy],lru}'“$ lru”“$ policy”| sort -k 1,1n | cut -d''-f2->“$ {policy} _sorted”' – samira

+0

这是一个不同的问题,所以接受这个答案,因为它回答您发布的问题(请参阅http://stackoverflow.com/help/someone-answers),然后问一个新问题。 –

+0

我不认为它回答我的问题,因为我能够在bash脚本之外完成awk的操作,但它不会在bash脚本中执行相同的操作。这个答案使得awk脚本能够完成其他功能。 – samira