2012-05-02 8 views
0

ファイル内の列内で文字列を検索してうまく動作する関数を導入しました。私はどのように文字列をすべての列を検索するためにそれを変更するのですか?Awk文字列の検索ファイル

awk -v s=$1 -v c=$2 '$c ~ s { print $0 }' $3 

おかげ

答えて

3

「すべての列」なら、「ファイル全体」を意味します。ここでは

grep $string $file 
+0

を私はそれが私ができることが可能になる方法を、1つの文字列に1つの列を検索する機能を持っています複数の検索文字列で検索するために複数の列をスクリプトに用意していますか? awk -v s = $ 1 -v c = $ 2 '$ c〜s {print $ 0}' $ 3 ありがとう –

0

は、異なる2を検索するために、あなたの現在のスクリプトを修正する一つの方法の例です。 2つの異なる列の文字列。あなたはあなたが望むだけ多くのために働くようにそれを拡張することができます。

awk -v s1="$1" -v c1="$2" -v s2="$3" -v c2="$4" '$c1 ~ s1 || $c2 ~ s2 { print $0 }' "$5" 

ご覧のとおり、この手法はうまく調整されません。

別の技術は、ファイルとして列番号と文字列を扱い、より良いスケーリングすべきである:

awk 'FNR == NR {strings[++c] = $1; columns[c] = $2; next} 
    { 
     for (i = 1; i <= c; i++) { 
      if ($columns[i] ~ strings[i]) { 
       print 
      } 
     } 
    }' < <(printf '%s %d\n' "${searches[@]}") inputfile 

アレイ${searches[@]}文字列と列番号の交流を含むべきです。

${searches[@]}にはいくつかの方法があります。ここでは一つだ:

#!/bin/bash 
# (this is bash and should precede the AWK above in the script file) 
unset searches 
for arg in "${@:1:$#-1}" 
do 
    searches+=("$arg") 
    shift 
done 
inputfile=$1 # the last remaining argument 
# now the AWK stuff goes here  

スクリプトを実行するには、あなたがこれを行うだろう:

$ ./scriptname foo 3 bar 7 baz 1 filename 
0
awk -v pat="$string" '$0 ~ pat' infile