Bash脚本通过一个文件grep查找列表名称,然后grep通过第二个文件匹配这些名称以获取查找值

时间:2013-08-30 20:48:54

标签: bash awk grep

不知何故,具体而言并不能很好地转化为标题。

这是我的目标,在cygwin环境中使用BASH脚本:

  1. 读取文本文件$ filename以获取模式和表名称列表
  2. 获取模式和表名称列表,并在$ lookup_file中查找匹配项以获取值
  3. 使用该值进行逻辑选择
  4. 我基本上每个项目都是单独工作的。我无法弄清楚如何将它们粘在一起。

    对于第一步,它是

    grep $search_string $filename | awk '{print $1, $5}' | sed -e 's~"~~g' -e 's~ ~\t~g'
    

    其中列出了模式{tab}表

    对于第二步,它是

    grep -e '{}' $lookup_file | awk '{print $3}'
    

    其中$ lookup_file是schema {tab} table {tab} value

    第三步基本上是根据返回的值做的事情"&#34 ;;提交报告,通过电子邮件发送警告,忽略它等等。

    我尝试将第一部分和第二部分与xargs一起使用,但它将模式和表名视为文件名并引发错误。

    我缺少的胶水是什么?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

awk -v s="$search_string" 'NR == FNR { if ($0 ~ s) { gsub(/"/, "", $5); a[$1, $5] = 1; }; next; } a[$1, $2] { print $3; }' "$filename" "$lookup_file"

说明:

NR == FNR { if ($0 ~ s) { gsub(/"/, "", $5); a[$1, $5] = 1; }; next; }定位第一个文件,在其上搜索有效匹配项,并将键值保存在数组a中。

a[$1, $2] { print $3; }定位第二个文件,如果找到与文件的第一列和第二列以及数组a中的键匹配的内容,则会在第三列中打印该值。

答案 1 :(得分:2)

awk -v search="$search_string" '$0 ~ search { gsub(/"/, "", $5);
                                              print $1"\t"$5; }' "$filename" |
    while read line
    do
        result=$(awk -v search="\b$line\b" '$0 ~ search { print $3; } ' "$lookup_file");
        # Do "something" with $result
    done