【问题标题】:awk variable inside a shell functionshell函数中的awk变量
【发布时间】:2015-08-16 12:01:59
【问题描述】:

我写了一个shell函数如下

extract () {        
    awk -vbegin="${1}" '/begin/ {flag=1;next} /=====/{flag=0} flag {
        print
    }   
    ' "$2" | egrep "$3" | egrep -v "$4"
}

但是,当我打电话时

extract "Begin Criteria" "First" "Second" "Third1|Third2"

第一个变量“Begin Criteria”似乎无法在 /begin/ 处解析

我怎样才能让我的电话类似于?

awk '/Begin Criteria/ {flag=1;next} /=====/{flag=0} flag {
        print
}
' First | egrep 'Second' | egrep -v 'Third1|Third2'

原始数据文件

First Bundle ====
    First 1       
        Second 1
            Third_1 1
            Third_2 1
=====

Second Bundle ====
    Second 1   
        Third_1 1
        Third_2 1
        Third_3 1
=====

Third Bundle ====
    Third_1 1  
    Third_2 1 
    Third_3 1
=====

First Bundle ====
    First 2           
        Second 2
            Third_1 2
            Third_2 2
=====

Second Bundle ====
    Second 2   
        Third_1 2
        Third_2 2
        Third_3 2
=====

Third Bundle ====
    Third_1 2   
    Third_2 2
    Third_3 2
=====

用法

extract "Second Bundle" Raw_data_file "Second" "Third1|Third2" Second.out
extract "Third Bundle" Raw_data_file "Third1|Third2" "" Third.out
extract "First Bundle" Raw_data_file "" "" First.out

预期

先出

First 1       
    Second 1
        Third_1 1
        Third_2 1
First 2       
    Second 2
        Third_1 2
        Third_2 2

第二次出局

Second 1   
Second 2   

第三次出局

Third_1 1   
Third_2 1   
Third_1 2   
Third_2 2   

【问题讨论】:

  • 您使用的是awk,然后是两个egreps。可能awk 一个人就够了。此外,发布一些示例输入和所需的输出以使其更清晰。最后,flag { print } 不是必须的;单独使用 flag 会得到相同的结果。
  • 输入输出帖子。感谢您的帮助

标签: bash shell variables awk


【解决方案1】:

要在 awk 中使用变量,您可以这样做:

awk -vbegin="${1}" '$0 ~ begin {flag=1;next} /=====/{flag=0} flag {
        print
}' 

当您使用 /begin/ 时,您实际上是在匹配文本 begin 而不是变量 begin

【讨论】:

    【解决方案2】:

    当您使用 awk 时,您永远不需要管道到/来自 grep 等,因为 awk 可以做 grep 可以做的任何有用的事情。将你的函数重写为:

    extract () {        
        awk -v begin="$1" -v plus="$3" -v minus="$4" '
            /=====/ {flag=0}
            flag && ($0 ~ plus) && ($0 !~ minus)
            $0 ~ begin {flag=1}
        ' "$2"
    }
    

    未经测试,因为您没有提供任何示例输入或预期输出。

    【讨论】:

    • 感谢您的帮助。我更新了我的问题,添加了示例输入和预期结果。如果我们只有一个“减号”/“加号”,您的建议解决方案就可以正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多