只需将变量传递给awk中的正则表达式或字符串搜索

时间:2015-07-22 18:45:38

标签: regex variables awk

这让我疯了。这就是我想做的事情,我尽可能地简化了:

这写入awk脚本:

#!/bin/bash/awk

# pass /^CHEM/, /^BIO/, /^ENG/ into someVariable and search file.txt

/someVariable/ {print NR, $0} 

或者我可以(但更少)

#!/bin/bash/awk

# pass "CHEM", "BIO", "ENG" into someVariable and search file.txt
$1=="someVariable" {print NR, $0}

我发现BASH / SHELL变量上的各种东西都被传递但我不想学习BASH编程来简单地将值传递给变量。

奖励:我实际上必须在每个文档中搜索125个值,需要评估40个文档。问一下这个问题并不会有什么害处,但我如何获取这125个值的单独文件,将它们单独传递给someVariable?

我在BASH中有各种各样的方法可以做到这一点,但我不理解它们,并且必须有一种方法可以在awk中动态循环一组搜索项(可能是由于我没有相信列表尚未存在)

谢谢你,因为我厌倦了把头撞到墙上。

3 个答案:

答案 0 :(得分:1)

  

我实际上必须在每个文档中搜索125个值,需要评估40个文档。

我们将要搜索的字符串放在$ cat file1 apple banana pear

file2

让我们调用我们要搜索的文件$ cat file2 ear of corn apple blossom peas in a pod banana republic pear tree

$ awk 'FNR==NR{a[$1]=1;next;} ($1 in a){print FNR,$0;}' file1 file2
2 apple blossom
4 banana republic
5 pear tree

要在file2中搜索file1中的任何单词,请使用:

FNR==NR{a[$1]=1;next;}

如何运作

  • a

    这会将我们要查找的每个单词存储为数组NR中的键。

    更详细地说,awkFNR到目前为止已阅读的行数,awkFNR==NR到目前为止读取的行数。当前文件。因此,如果file1,我们仍在阅读第一个命名文件:file1。对于a[$1]中的每一行,我们将1设置为next

    awk告诉($1 in a){print FNR,$0;}跳过其余的命令,然后从下一行重新开始。

  • a

    如果我们接到这个命令,我们就在文件2上。

    如果第一个字段是数组let rec calc i prevPrev prev total = if i = 0 then // exit condition; do your final calc exp(-xa * xa) * (total - prevPrev) / 4. else // recur condition, call again let newPrevPrev = prev let newPrev = total let newTotal = (T * newPrev - newPrevPrev + a i) calc (i-1) newPrevPrev newPrev newTotal calc 24 initPrevPrev initPrev initTotal 中的键,那么我们打印行号和行。

答案 1 :(得分:0)

“...例如,我希望文件2中的两个正则表达式之间的文本。假设/ apple /,/ pear /。我将如何替换并提取这两个正则表达式之间的文本?...

while read b e; do awk "/^$b$/,/^$e$/" <(seq 1 100); done << !
> 1 5
> 2 8
> 90 95
> !
1
2
3
4
5
2
3
4
5
6
7
8
90
91
92
93
94
95

这两个感叹号之间是范围的输入,而我使用的数据文件是1..100。请注意awk脚本中的双引号而不是单引号。

如果您在文件范围中输入了起始结束值,而在文件数据中输入了数据

 while read b e; do awk "/^$b$/,/^$e$/" data; done < ranges

如果要将各种范围打印到不同的文件,可以执行以下操作

while read b e; do awk "/^$b$/,/^$e$/ {print > $b$e}" data; done < ranges

答案 2 :(得分:0)

您可能会或可能不会喜欢的轻微变化......我有时会使用BEGIN部分将文件内容读入数组......

BEGIN   {
        count = 1
        while ("cat file1" | getline)
                {
                a[count] = $3
                count++
                }
        }

其余的以同样的方式继续。无论如何,也许这也适合你。