2012-05-02 107 views
0

我已經實現了一個函數,該函數在文件中搜索字符串中的一列,並且效果很好。我想知道如何修改它以搜索字符串中的所有列?Awk搜索文件的字符串

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

感謝

回答

3

如果「所有列」的意思是「整個文件」,然後:

grep $string $file 
+0

我有一個字符串搜索一列的功能,我將如何允許它這樣我就可以提供我的腳本多列搜索多個搜索字符串? awk -v s = $ 1 -v c = $ 2'$ c〜s {print $ 0}'$ 3 謝謝 –

0

這裏是一種方式的例子來修改當前的腳本來搜索兩個不同兩個不同列中的字​​符串。您可以將其擴展至您想要的數量,但是,如果您使用其他方式,則可以使用更多的效率。

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