2015-11-09 58 views
1

我無法獲得將在指定列中搜索輸入項的正則表達式。如果在該列中找到該術語,則需要輸出該整行。 這是我的變量:在文本文件中搜索列的正則表達式

sreg = search word #Example: Adam 
file = text file #Example: Contacts.txt 
sfield = column number #Example: 1 

文本文件的格式如下用空格作爲分隔符領域,有許多聯繫人條目:

First Last Email Phone Category  
    Adam aster [email protected] 8473847548 word 
    Jeff Williams [email protected] 940342221995 friend 
    JOhn smart [email protected] 999999393 enemy 
    yooun yeall adada 111223123 other 
    zefir sentr [email protected] 8847394578 other 

我沒有成功嘗試:

grep "$sreg" "$file" | cut -d " " -f"$sfield"-"$sfield" 
awk -F, '{ if ($sreg == $sfield) print $0 }' "$file" 
awk -v s="$sreg" -v c="$sfield" '$c == s { print $0 }' "$file" 

感謝您的幫助!

+0

謝謝,添加更多信息。空格是字段分隔符。 – Joe

+0

$ sfield => 1,2,..需要另一個表達式將其更改爲$ 1,$ 2 ... –

+0

您的快遞awk -vs =「$ sreg」-vc =「$ sfield」'$ c == s {print $ 0}'「$ file」看起來是正確的。 –

回答

4

awk可以是用於此的最佳解決方案:

awk -v field="$field" -v name="$name" '$field==name' "$file" 

這用來檢查場號$field具有值$name。如果是這樣,awk會自動打印包含它的整行。

例如:

$ field=1 
$ name="Adam" 
$ file="your_file" 
$ awk -v field="$field" -v name="$name" '$field==name' "$file" 
Adam aster [email protected] 8473847548 word 

正如你所看到的,我們給使用-v var="$bash_var",這樣就可以使用它們裏面awk的參數。

另外,空格是字段分隔符,所以您不需要指定它,因爲它是默認值。

+1

謝謝!這幫助了很多。 – Joe

1

這個工作對我來說:

awk -v f="$sfield" -v reg="$sreg" '{if ($f ~ reg) {print $0}}' "$file" 

主要問題是,你需要從$元數的間接(例如, 「1」)$($元數)(例如,$ 1)。

我試過使用backtricks`,並且使用$ {!sfield},但它們不能在awk中工作,因爲awk不接受這個。最後,我找到了將變量傳遞給awk的方式,轉換爲awk內部變量(使用-v)。

在awk中,我發現你甚至不能訪問外部變量。所以我也必須通過$ sreg。

更新:我認爲使用「〜」而不是「==」更好,因爲原始需求表示匹配==正則表達式。

例如, sreg =廣告

+0

請注意'{if(condition){print $ 0}}'可以被重寫爲單純的'condition'。爲什麼?因爲'awk'以一種方式評估每個表達式,如果它是True,則打印當前記錄(行)。 – fedorqui

+0

感謝您的評論,它有助於。 –

+0

比較==,真的是平等的比較嗎?如果我們想要匹配一個正則表達式,使用〜會更好嗎? –

相關問題