只保留包含 XYZ 数据的 .csv 列?

只保留包含 XYZ 数据的 .csv 列?

如何保留仅包含单词dogorcat且仅在第二列上检查它们的 .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

几种方法:

  1. 如果dogorcat始终是该行的最后一个单词:

    awk '/(dog|cat)$/' file
    grep -E '(dog|cat)$' file
    sed -n '/\(dog\|cat\)$/p' file
    perl -ne 'print if /(dog|cat)$/' file
    
  2. 如果dogorcat可以出现在第二个的任意位置以空格分隔场地:

    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
    
  3. 要从文件中读取搜索模式,您可以执行以下操作:

    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出现在该行的第二列上的行。

相关内容