2016-04-21 60 views
2

我有這個輸入文件:file_in.txt(由管道分隔)基於特定字段的grep/awk特定行;使用KSH變量使用awk

3345:tyg|rty|27|0|0|ty6|{89|io|}62|0 
3346:tyg|rtyuio|63|0|1|ty6|{89|gh|}45|0 
3347:tyu|ray|24|0|0|ty6|{89|uh|}27|0 
3348:tyg|rtoy|93|0|1|ty6|{89|yh|}1|0 
3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0 

我想只有那些使用'|'作爲分隔符具有第九字段值}27線,從而使我的輸出應該是:

3347:tyu|ray|24|0|0|ty6|{89|uh|}27|0 
3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0 

下面的命令正常工作:

awk -F"|" '{ if ($9 == "}27") print $0 }' file_in.txt 

但我想用一個shell變量,而不是"}27"爲此我嘗試這樣做:

taskid="}27"  
awk -v tid="$taskid" -F"|" '{ if ($9 == "}tid") print $0 }' file_in.txt 

請幫我找出我在哪裏使用這個命令去錯了。 任何其他命令建議,以實現相同的讚賞。

+0

什麼是命令的輸出可選空白,你試過嗎? – Ben

回答

2

假設負責你的shell變量$的值爲27,要使用這些形式之一:

  1. 與外殼

    awk -v tid="}$taskid" -F"|" '$9 == tid' file 
    
  2. 的開括號打造串或者在awk中執行它--- awk的字符串連接只是將st吊環並排側與

    之間
    awk -v tid="$taskid" -F"|" '$9 == "}" tid' file 
    
+0

This很好,謝謝! –

4

這應該工作:

taskid="}27" 

awk -F'|' -v tid="$taskid" '$9 == tid' file 

輸出:

3347:tyu|ray|24|0|0|ty6|{89|uh|}27|0 
3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0 
+0

這也很好......謝謝! –

+0

很高興知道它解決了[[您可以點擊答案左上角的勾號**標記答案](http://meta.stackexchange.com/a/5235/160242) – anubhava

1

自己的命令應該有這種變化的工作:

$ ksh 
$ taskid=}27 
$ awk -v tid=$taskid -F"|" '{ if ($9 == tid) print $0}' file_in.txt 

輸出:
3347:tyu | ray | 24 | 0 | 0 | ty6 | {89 | uh |} 27 | 0 3349:tyo | rtert | 28 | 0 | 0 | ty6 | {89 | gh |} 27 | 0

+0

我想匹配'$ 9'到'} tid'而不是'tid' ...所以這是行不通的。 –

+0

我不確定你的需求有哪些變化。但是我沒有理由不說明我沒有工作。爲了清楚我想根據您的需求解決什麼問題,我添加了幾條附加行。 – Learner

+0

現在它工作正常......我從另一個命令得到taskid爲'27'而不是'} 27'所以glenn建議的答案似乎更合適...但是這個編輯版本也工作正常..謝謝 –