2

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

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

  1. 读取文本文件 $filename 以获取模式和表名列表
  2. 获取模式和表名列表并在 $lookup_file 中找到匹配项以获取值
  3. 使用该值进行逻辑选择

我基本上让每个项目单独工作。我只是不知道如何将它们粘合在一起。

对于第一步,它是

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 是模式{tab}表{tab}值

第三步基本上就是根据返回的值,做“某事”;提交报告,通过电子邮件发送警告,忽略它等。

我尝试将第一部分和第二部分与 xargs 一起串起来,但它会将架构和表名视为文件名并引发错误。

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

4

2 回答 2

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

于 2013-08-30T21:17:47.513 回答
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
于 2013-08-30T20:59:31.257 回答