我有一個包含多列數據的大文本文件。我試圖編寫一個腳本,它接受來自命令行的列號和關鍵字,並在顯示整行任何匹配之前搜索任何匹配。Linux腳本:搜索關鍵字的特定列
我一直在試圖沿着線的東西:
grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'
但是,這並不在所有的工作。我在正確的路線?謝謝你的幫助!
我有一個包含多列數據的大文本文件。我試圖編寫一個腳本,它接受來自命令行的列號和關鍵字,並在顯示整行任何匹配之前搜索任何匹配。Linux腳本:搜索關鍵字的特定列
我一直在試圖沿着線的東西:
grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'
但是,這並不在所有的工作。我在正確的路線?謝謝你的幫助!
-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
看起來不夠合理。嘗試使用set -x
來查看傳遞給awk
的確切內容。您還可以使用不同的和/或更多的awk的東西,包括擺脫單獨的grep:
awk -v colnum=$columnNumber -v require="$searchTerm"
"/$fileName/ { if (\$colnum == require) print }"
其中工程通過設置awk的變量(colnum
和require
,在這種情況下),然後使用文本字符串$colnum
到獲取所需的字段,並將變量require
獲取所需的字符串。
注意,在所有情況下(有或沒有grep
命令),在$fileName
任何正則表達式元字符將元Y,例如,將this.that
名爲this.that
該文件,但也命名thisXthat
文件相匹配。
您同時使用'-v'變量傳遞和嵌入式shell變量。我建議您只使用變量傳遞,爲外部集合使用單引號並避免分散轉義。當你使用'-v'時,你還應該引用* all * shell變量。匹配變量時,您需要使用匹配運算符而不是斜槓。這裏是你的答案的修改版本:'awk -v colnum =「$ columnNumber」-v require =「$ searchTerm」-v file =「$ fileName」'$ 0〜file && $ colnum == require''。請注意,「印刷」是隱含的。 –
@丹尼斯威廉姆森:是的,我對列號引用有點懶,因爲它必須是一個數字。請注意,'$ 0〜var'在舊的awk中不起作用,但是,例如,SunOS:'$ awk'$ 0〜'pattern'''給出:'awk:第1行附近的語法錯誤。如果你不需要處理古老的awk,那就使用全變量版本。 – torek
Woooo!這工作,非常感謝xxxxxxx –
感謝:-)很高興我可以幫助 – Steve
@ user1136076:我建議引用這些shell變量。 –