我在这里示例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
的每一行执行以下命令:
list.txt
的第1列获取字符串,然后搜索第三个文件file.txt
list.txt
所以我的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
命令。
答案 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
)拆分为k
和v
。
grep -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 != ''