如何保留仅包含单词dog
orcat
且仅在第二列上检查它们的 .csv 行数据,如果单词“dog”出现在任何其他列但不是第二列上,则应将其忽略。
例如,如果我有:
email1.com dog
email2dog.com steve
email3.com cat
预期输出:
email1.com dog
email3.com cat
可能需要保留一长串单词,因此如果可能的话从另一个文件加载它们。
答案1
和sed
:
$ sed -n -e 's/dog$/&/p' -e 's/cat$/&/p' file
email1.com dog
email3.com cat
或者你可以使用awk
:
awk '$2~/^dog|cat$/' file
答案2
几种方法:
如果
dog
orcat
始终是该行的最后一个单词:awk '/(dog|cat)$/' file grep -E '(dog|cat)$' file sed -n '/\(dog\|cat\)$/p' file perl -ne 'print if /(dog|cat)$/' file
如果
dog
orcat
可以出现在第二个的任意位置以空格分隔场地:awk '$2~/dog|cat/' file grep -E '^\S+\s+\S*(dog|cat)\S*\s*' file perl -ane 'print if $F[1]=~/dog|cat/' file sed -nr '/^\S+\s+\S*(dog|cat)\S*\s*/p' file sed -n '/^\S\+\s\+\S*\(dog\|cat\)\S*\s*/p' file
要从文件中读取搜索模式,您可以执行以下操作:
awk '{if(NR==FNR){a[$0]++; next}for(p in a){if($2~p){print}}}' patterns file
答案3
{ sed 's/[]$^&\./*[]/\\&/g;s/$/$/'|
grep -f- ./greppedfile
} <words
可以处理您正在处理大量匹配模式的情况words
每行包含一个模式。它会小心地转义任何可能的正则表达式元字符然后将生成的模式锚定在该行的末尾,因此其中的任何字符words
将按字面意思进行匹配grep
,并且其模式仅在以下情况下才会匹配单词发生在一行的尾部 - 这是我认为我所理解的想要的。
通常grep
我们没有像这样的元字符转义,因为我们可以使用-F
固定字符串模式 - 它没有任何元字符转义。但是,这也意味着,我们不能使用$
元字符来锚定模式,所以我们使用我们得到的东西。
答案4
grep
与 PCRE 一起使用:
$ grep -P '^[^ ]+\s+dog|cat(?=\s|$)' file.txt
email1.com dog
email3.com cat
dog
这将打印仅cat
出现在该行的第二列上的行。