簡體   English   中英

如何在awk中的模式前后匹配任何內容?

[英]How to match anything before and after a pattern in awk?

以下awk代碼在file.csv的第二列中搜索$find ,並輸出在第一條匹配行的第一列中找到的數據:

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

例如,給定file.csv

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

如果$find設置為“ cat”,則打印“ 5”。

這似乎只匹配單元格的全部內容,類似於grep ^cat$

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

  • 僅應輸出第一個匹配項。

我嘗試了以下方法,但是它們沒有按預期工作:

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

AWK語言編程-正則表達式中 ,我找不到在awk前后匹配任何內容的指令。

不應該這樣 您正在使用一個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

除了JS解釋的內容外,對於搜索字符串可能包含特殊正則表達式字符的情況,還有另一種以非正則表達式方式執行此搜索的方法是使用index函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM