0

パターン ファイル:

wicked liquid
movie
guitar
balance transfer offer
drive car

bigfile ファイル:

wickedliquidbrains
drivelicense
balanceofferings

コマンドラインで awk を使用:

awk '/balance/ && /offer/' bigfile

私は欲しい結果を得る

balanceofferings

awk '/wicked/ && /liquid/' bigfile  

私にくれます

wickedliquidbrains, which is also good..


awk '/drive/ && /car/' bigfile

私は && を持っているので、これも良いドライブライセンスを与えてくれません

'/regex1/ && /regex2/.. etc' を含むシェル変数を awk..

awk -v search="$out" '$0 ~ search' "$bigfile"

awk が実行されません。何が問題なのですか??

4

2 に答える 2

2

これを試して:

awk "$out" "$bigfile"

を行う場合$0 ~ search、 の値はsearch正規表現でなければなりません。しかし、それらの間に正規表現の束を含む文字列に設定していました&&-それは有効な正規表現ではありません。

一致する行に対してアクションを実行するには、次のようにします。

awk "$out"' { /* do stuff */ }' "$bigfile"

アクションが awk 変数を使用する場合に備えて、アクションを二重引用符から単一引用符に切り替えました$

于 2013-05-31T01:20:06.243 に答える
1

更新しました

で渡された引数を使用した Barmars のソリューションの代替-v:

awk -v search="$out" 'match($0,search)' "$bigfile"

テスト:

$ echo -e "one\ntwo"|awk -v luk=one 'match($0,luk)'
one

2 つの (実際の) 正規表現 (ERE) をに渡す:

echo -e "one\ntwo\nnone"|awk -v re1=^o -v re2=e$ 'match($0,re1) && match($0,re2)'

出力:

one

pattern_file を読み取り、すべての行に対して一致させたい場合は、次のようなことを試すことができます。

awk 'NR==FNR{N=NR;re[N,0]=split($0,a);for(i in a)re[N,i]=a[i];next}
{
  for(i=1;i<=N;++i) {
    #for(j=1;j<=re[i,0]&&match($0,re[i,j]);++j);
    for(j=1;j<=re[i,0]&&$0~re[i,j];++j);
    if(j>re[i,0]){print;break}
  }
}' patterns_file bigfile

出力:

wickedliquidbrains

1 行目で、pattern_file を読み取り、2D 配列に格納しreます。各行には、分割された入力文字列が含まれています。各行の 0 番目の要素は、その行の長さです。次に、読み取りますbigfile。の各行は、配列bigfileの一致についてテストされます。re行のすべての項目が一致する場合、その行が印刷されます。

于 2013-05-31T08:08:48.823 に答える