【问题标题】:loop over array in sed in bash在bash中循环sed中的数组
【发布时间】:2014-10-19 19:48:10
【问题描述】:

我有一个很长的列表(约 100 行),其中包含动物的名称、它们在哪里被发现以及何时命名为 spottings。前 3 行可能是这样的:

cat 1999 madagascar 
dog 1827 peru 
kangaroo 1995 new zealand
cat 1827 england

现在我想将该列表与另一个列表 want 进行匹配,如下所示:

cat
dog
kangaroo

但是,我只想获取与给定year 匹配但与给定location 匹配的行。例如,对于1827england,我是这样做的:

cat spottings | grep -i -f want | sed '/1827/I!d;/england/Id'

现在,如果我的 yearlocation 位于这样的字符串中:

want="1827,1999,2013" # year
nonotwant="england,madagascar,peru" # location

它被做成这样的数组:

want=($(echo ${want} | tr ',' '\n'))

如果我检查wantdonotwant的所有元素,它会是这样的:

sed spottings | grep -i -f want | sed '/1827/I!d;/1999/I!d;/2013/I!d;/england/Id;/madagascar/Id;/peru/Id'

如何检查两个数组中的所有元素?

【问题讨论】:

  • 为了消除歧义,你会为给定的wantnonotwant 显示你想要的输出吗?此外,命令sed '/1827/I!d;/1999/I!d 将删除所有行,除非它们的年份在同一行上。相反,您是否希望它消除所有行,除非它们有一个或另一个?请澄清。

标签: arrays bash shell sed


【解决方案1】:

为什么不是

fgrep -i -f want spottings | fgrep -i -f WantYear | fgrep -v -f NotWantLocation

其中 wantWantYearNotWantLocation 是每行有 1 个条件的文件。

【讨论】:

  • 如果可能的话,我真的更喜欢将 WantYearNotWantLocation 作为数组。
  • 从您的数组中生成一个临时文件。(f)grep 从参考文件源非常快
猜你喜欢
  • 2016-07-27
  • 1970-01-01
  • 2012-04-16
  • 2012-05-24
  • 2012-03-31
  • 1970-01-01
  • 2015-09-01
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多