2012-04-29 26 views
4

我有一個包含多列數據的大文本文件。我試圖編寫一個腳本,它接受來自命令行的列號和關鍵字,並在顯示整行任何匹配之前搜索任何匹配。Linux腳本:搜索關鍵字的特定列

我一直在試圖沿着線的東西:

grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'

但是,這並不在所有的工作。我在正確的路線?謝謝你的幫助!

回答

2

-v選項可用於將shell變量傳遞給awk命令。

以下可能是你在找什麼:

awk -v s=$SEARCH -v c=$COLUMN '$c == s { print $0 }' file.txt

編輯:

我總是試圖寫出更優雅,更緊湊的代碼。因此,這裏的丹尼斯表示:

awk -v s="$search" -v c="$column" '$c == s { print $0 }' file.txt

+0

Woooo!這工作,非常感謝xxxxxxx –

+0

感謝:-)很高興我可以幫助 – Steve

+0

@ user1136076:我建議引用這些shell變量。 –

0

看起來不夠合理。嘗試使用set -x來查看傳遞給awk的確切內容。您還可以使用不同的和/或更多的awk的東西,包括擺脫單獨的grep:

awk -v colnum=$columnNumber -v require="$searchTerm" 
    "/$fileName/ { if (\$colnum == require) print }" 

其中工程通過設置awk的變量(colnumrequire,在這種情況下),然後使用文本字符串$colnum到獲取所需的字段,並將變量require獲取所需的字符串。

注意,在所有情況下(有或沒有grep命令),在$fileName任何正則表達式元字符將元Y,例如,將this.that名爲this.that該文件,但也命名thisXthat文件相匹配。

+1

您同時使用'-v'變量傳遞和嵌入式shell變量。我建議您只使用變量傳遞,爲外部集合使用單引號並避免分散轉義。當你使用'-v'時,你還應該引用* all * shell變量。匹配變量時,您需要使用匹配運算符而不是斜槓。這裏是你的答案的修改版本:'awk -v colnum =「$ columnNumber」-v require =「$ searchTerm」-v file =「$ fileName」'$ 0〜file && $ colnum == require''。請注意,「印刷」是隱含的。 –

+0

@丹尼斯威廉姆森:是的,我對列號引用有點懶,因爲它必須是一個數字。請注意,'$ 0〜var'在舊的awk中不起作用,但是,例如,SunOS:'$ awk'$ 0〜'pattern'''給出:'awk:第1行附近的語法錯誤。如果你不需要處理古老的awk,那就使用全變量版本。 – torek