读取文件列的每一行并执行grep

时间:2017-06-14 11:38:45

标签: bash awk grep echo

我在这里示例file.txt

This line contains ABC
This line contains DEF
This line contains GHI

以及以下list.txt

contains ABC<TAB>ABC
contains DEF<TAB>DEF

现在我正在编写一个脚本,为该外部文件list.txt的每一行执行以下命令:

  1. list.txt第1列获取字符串,然后搜索第三个文件file.txt
  2. 如果第一个命令是肯定的,则返回list.txt
  3. 第2列中的字符串

    所以我的output.txt是:

    ABC
    DEF
    

    这是我的grep / echo代码,手动放置查询/返回字符串:

    if grep -i -q 'contains abc' file.txt
    then
        echo ABC >output.txt
    else
        echo -n
    fi
    if grep  -i -q 'contains def' file.txt
    then
        echo DEF >>output.txt
    else
        echo -n
    fi
    

    我有大约100个搜索字词,如果手动完成,这会使任务费力。那么如何在该脚本中包含while read line; do [commands]; done<list.txt以及有关column1和column2的命令? 如果可能,我想使用简单的grep / echo / awk命令。

2 个答案:

答案 0 :(得分:1)

这样的东西?

$ awk -F'\t' 'FNR==NR { a[$1] = $2; next } {for (x in a) if (index($0, x)) {print a[x]}}     '   list.txt file.txt
ABC
DEF

对于第一个文件(FNR==NR)的行,请读取数组a的键值对。然后对于第二行的行,循环遍历数组,检查是否在该行上找到了键,如果是,则打印存储的值。 index($0, x)尝试从(当前行)x中找到$0的内容。 $0 ~ x会将x作为正则表达式来匹配。

如果您想在shell中执行此操作,请为grep的每一行开始单独的list.txt,如下所示:

while IFS=$'\t' read k v ; do 
    grep -qFe "$k" file.txt && echo "$v"
done < list.txt

read k v读取一行输入并将其(基于IFS)拆分为kvgrep -F将模式视为固定字符串,而不是正则表达式,-q阻止它输出匹配行。如果找到任何匹配的行,则grep会返回true,因此如果在file.txt中找到$v,则会打印$k

答案 1 :(得分:0)

使用awk和grep:

select top 100 
    sd.Uid
  , sd.ProDate
  , sd.ProTime
  , x.Auto_No as Auto_No
from Has_Swipedata sd
  inner join (
    select i.Uid, i.ProDate, Auto_No = min(i.Auto_No) 
    from Has_Swipedata i
    group by i.Uid, i.ProDate
  ) x
    on sd.Uid = x.Uid
   and sd.ProDate = x.ProDate
   and sd.Auto_No = x.Auto_No
where sd.ProDate = convert(date,getdate())
  and sd.Is_Active = 'N'
  and sd.Uid not like '%[^0-9]%'
  and sd.Uid != ''