在awk中遇到问题,同时在文件中搜索时使用变量作为搜索模式

时间:2015-10-07 13:09:22

标签: bash file shell design-patterns awk

date;
tocompdate=$(date --date="-90 days ago" +%d%m%Y)
echo $tocompdate;

awk -v pattern="$testdate" '{print "Some matter "nr[NR--]" matter "$testdate""};' tocompare.txt >> mail2sent.txt`

我在这里收集当前日期并为其添加90天并将其存储在tocompdate中。并且将tocompdate与文件进行比较,其中一行中存在相同的日期,而在该行之前的其他行中存在其他一些事项。

当匹配搜索模式时,我需要打印一些文本,并且#34;匹配行之前的行"在几句话后打印并再次匹配。

例如:

文件低于内容

a1
28112019
b2
04032018
c3
04032018
d4
27072015
e5
27072015
f6
06012030

如果我要与27072015进行比较,我希望输出如下

The d4 is on 27072015
The e5 is on 27072015

3 个答案:

答案 0 :(得分:3)

$ awk -v tgt="27072015" '$0==tgt{printf "The %s is on %s\n", p, $0} {p=$0}' file
The d4 is on 27072015
The e5 is on 27072015

答案 1 :(得分:0)

我建议只使用shell编程的解决方案:

#!/bin/sh 

match="27072015"

while IFS= read -r i
do if [ "$i" = "$match" ]
   then printf "The %s is on %s\n" "$last" "$match"
   fi
   # test that we are not in a whitespace
   if [ -n "$i" ]
   then last="$i"
   fi
done < tocompare.txt

注意:此解决方案仅适用于没有特殊字符的非常小且简单的数据集。此外,它比使用awk慢得多。

答案 2 :(得分:0)

只是为了好玩:使用sedgrepxargs的其他解决方案

xargs -n 2 <file | grep -E '\b27072015$' | sed -r 's/^(\S+)\s(\S+)$/The \1 is on \2/g'

你明白了,

The d4 is on 27072015
The e5 is on 27072015