【问题标题】:Bash: grep selected text from a fileBash:grep从文件中选择的文本
【发布时间】:2015-02-10 18:22:37
【问题描述】:

我有两个文件,file1:

abc/def/ghi/ss/sfrere/sfs
xyz/pqr/sef/ert/wwqwq/bh

文件2:

ind abc def
bcf pqr sss

我希望从 file1 grep 文本文件,这样 file2 的任何行上的任何单词都匹配 file1 的一行,所以在这种情况下,答案将是第一行,因为 abc 和 def 存在于 file1 的第一行。第 1 行中的 2 个或更多单词应该在文件 2 的任何行中匹配。

【问题讨论】:

  • pqr 出现在第 2 行,那么为什么不希望在输出中出现第 2 行?
  • sss 和 bcf 都没有在第二行,三个中的两个应该在那里
  • 那么,要匹配文件 1 中的一行,文件 2 中的一行必须至少存在 2 个单词?还是正好是2个字,还是3个字也行??请在问题中添加这些详细信息。
  • 3 也可以,超过 2 应该匹配。
  • 如果 file2 中的一个单词在 file1 的一行中出现两次会怎样?应该打印那行吗?

标签: text awk sed grep


【解决方案1】:

这应该可以解决问题,

awk 'FNR==NR{a[$1];next}{for(i in a){c=0;for(j=1;j<=NF;j++){if(index(i,$j)>0)c++}if(c>=2)print i}}' file1.txt file2.txt

说明

FNR==NR{a[$1];next} 将遍历第一个 File1.txt 并将行存储在 a 中。

for(i in a) 将遍历上面存储的行,

c=0 只是为了进行数字检查以跟踪匹配的列数。

for(j=1;j&lt;NF;j++) 循环遍历 File2.txt 行中的列

如果File2.txt 中的一列在File1.txt 的行中,则if(index(i,$j)&gt;0)c++ 递增计数器。

if(c&gt;=2)print i你给定的条件,它应该匹配至少2列,然后我们打印来自File1.txt的行。


这是我能想到的最直接的方法,我敢肯定还有更疯狂的方法。

【讨论】:

  • @NooB8374 你能告诉我它到底在打印什么吗?
【解决方案2】:

大文件

sed 's/\([^ ]*\) \([^ ]*\) \([^ ]*\)/(\1.*\2)|(\2.*\1)|(\1.*\3)|(\3.*\1)|(\2.*\3)|(\3.*\2)/' file2 >/tmp/file2.egrep
egrep -f /tmp/file2.egrep file1
rm >/tmp/file2.egrep

根据 file2 内容为 egrep 创建一个临时模式匹配

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多