2014-04-06 59 views
1

$findfile.csv第2列之間的以下awk代碼的搜索,並輸出在第一個匹配行的第1列中找到的數據:如何匹配awk中的模式之前和之後的任何內容?

awk -v pattern="$find" '$2 ~ pattern { print $1; exit }' file.csv 

例如,給定的file.csv

1,panda 
2,zebra 
3,bobcat 
4,lion 
5,cat 

如果$find設置爲「貓」,它打印「5」。

這似乎只匹配整個單元格的內容,類似於grep中的^cat$

我該如何調整它,使其發現文本第一次出現在單元格內的某處,例如,如果$find設置爲「cat」,則打印「3」,因爲「bobcat」包含單詞「cat 」。換句話說,與在CSV中匹配整個單元格不同,如果在單元格內的某個位置找到匹配項,就足夠了。只有

  • 第一場比賽應該是輸出。

我嘗試以下,但他們沒有達到預期效果:在AWK Language Programming - Regular Expressions之前和在awk後匹配任何

awk -v pattern="*$find*" '$2 ~ pattern { print $1; exit }' file.csv 

我找不到任何說明。

回答

4

它不應該。您正在使用csv文件並且未將字段分隔符設置爲,

這裏是你所期望的輸出:

$ cat file.csv 
1,panda 
2,zebra 
3,bobcat 
4,lion 
5,cat 
$ find=cat 
$ awk -F, -v pattern="$find" '$2 ~ pattern { print $1; exit }' file.csv 
3 

對於準確匹配,使用==代替~

$ awk -F, -v pattern="$find" '$2==pattern { print $1; exit }' file.csv 
5 
3

除了什麼JS解釋存在於非正則表達式的方式執行該搜索的情況下,當你搜索字符串可能包含的特殊字符的另一種方式是通過使用index功能:

find='cat' 
awk -F, -v pattern="$find" 'index($2, pattern) { print $1; exit }' file.csv 
3 
相關問題