2011-03-10 57 views
2
1 #!/bin/bash 
2 KEY_FILE="keys" 
3 TABLE_FILE="table" #pipe delimited data 
4 
5 i=0; 
6 while read key #print out rows in table file with key in keys file 
7 do 
8 let i=i+1 
9 # key is first column in table 
10 # print status to stderr 
11 (echo "$KEY_FILE : line $i" >&2) 
12 awk -F '|' "\$1 == $key {print \$0}" $TABLE_FILE 
13 done < $KEY_FILE 
14 

從第12行,將針對AWK如果有一個白色的空間差異的關鍵的第一列匹配嗎?比賽在AWK忽略空格

+1

如果你的文件被排序(它們可以在運行中排序),你可以使用'join'實用程序,並且輸出的順序可能與輸入順序不同。 – 2011-03-11 03:17:57

+0

是的!感謝您看到我的問題,並讓我意識到另一個偉大的Unix實用程序。 – mkirk 2011-03-11 20:55:06

回答

2

不,因爲您設置了字段分隔符。空白字符現在很重要。

你可以設置你的字段分隔符是一個正則表達式來吸取空白。另外,將shell變量的值傳遞給awk變量以避免引用地獄。

gawk --posix -F '[[:space:]]*\|[[:space:]]*' -v k=$key '$1 == k' $TABLE_FILE 

請注意,{print $0}是默認動作,所以可以省略。

此外,AWK可以處理兩個文件,所以您不必在bash循環:

gawk --posix -F '[[:space:]]*\|[[:space:]]*' ' 
    NR == FNR {key[$1] = ""; next} 
    ($1 in key) 
' $KEY_FILE $TABLE_FILE 

表達NR == FNR意味着AWK是在文件列表中查看第一個文件(NR是「總記錄編號」和FNR是當前文件的記錄編號:它們只會與第一個文件相同)。該程序將密鑰保存在key數組中,並將表中的記錄打印在陣列中具有密鑰的記錄中。

+0

感謝您的迴應,您回答了我原來的問題,但現在我對您的優異解決方案感到好奇。雖然它不適合我(不打印任何匹配)。 – mkirk 2011-03-11 00:18:58

+0

@mkirk,請向我們展示您的文件的示例。 – 2011-03-11 01:11:14