【问题标题】:Awk Search file for stringawk 搜索文件中的字符串
【发布时间】:2012-05-11 12:19:16
【问题描述】:

我已经实现了一个在文件中的列中搜索字符串的函数,它运行良好。我想知道如何修改它以搜索字符串的所有列?

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

谢谢

【问题讨论】:

    标签: linux scripting awk


    【解决方案1】:

    如果“所有列”表示“整个文件”,则:

    grep $string $file
    

    【讨论】:

    • 我有一个函数可以在一列中搜索一个字符串,我将如何允许它为我的脚本提供多列以使用多个搜索字符串进行搜索? awk -v s=$1 -v c=$2 '$c ~ s { print $0 }' $3 谢谢
    【解决方案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
    

    【讨论】:

      【解决方案3】:
      awk -v pat="$string" '$0 ~ pat' infile
      

      【讨论】:

        猜你喜欢
        • 2021-01-16
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 2016-10-11
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        相关资源
        最近更新 更多