Сохранять только столбец .csv, содержащий данные XYZ?

Как я могу сохранить данные строки .csv, содержащие только слова « dog или « cat и проверять их только на втором столбце, если слово «собака» появляется на любом другом столбце, но не на втором, тогда его следует игнорировать.

Например, если бы у меня было:

 email1.com dog email2dog.com steve email3.com cat 

Ожидаемый результат:

 email1.com dog email3.com cat 

Там может быть длинный список слов, чтобы сохранить, если возможно, загрузить их из другого файла.

С sed :

 $ sed -n -e 's/dog$/&/p' -e 's/cat$/&/p' file email1.com dog email3.com cat 

Или вы можете использовать awk :

 awk '$2~/^dog|cat$/' file 

Несколько подходов:

  1. Если dog или cat всегда являются последним словом на линии:

     awk '/(dog|cat)$/' file grep -E '(dog|cat)$' file sed -n '/\(dog\|cat\)$/p' file perl -ne 'print if /(dog|cat)$/' file 
  2. Если dog или cat могут находиться где угодно во втором поле с разделителями-пробелами :

     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 
 { sed 's/[]$^&\./*[]/\\&/g;s/$/$/'| grep -f- ./greppedfile } <words 

Будет обрабатывать случай, когда вы имеете дело с большим количеством шаблонов совпадений в words содержащих шаблон на строку. Он избегает любых возможных метасимволов регулярных выражений и затем привязывает результирующий шаблон – в хвосте строки – поэтому любой символ в words будет согласован буквально с помощью grep и его шаблон будет согласован только в том случае, если слово происходит в хвосте строки – Это то, что, как я думаю, я понимаю, разыскивается.

Обычно с grep у нас нет метакадров, так как мы можем использовать шаблоны -F смешанной строки, которых нет. Но это также означает, что мы не можем использовать $ metachar для привязки шаблона, поэтому мы работаем с тем, что получили.

Я сделал бы это в Perl:

 #!/usr/bin/perl; use strict; use warnings; my @words = qw ( dog cat ); my $column_num = 1; #perl starts arrays zero. my $regex = join( "|", map {quotemeta} @words ); $regex = qr/$regex/; while (<>) { print if ( split() )[$column_num] =~ $regex; } 

Вы загружаете «регулярное выражение с помощью @wordsqw – это просто «цитируемые слова», например, пробел. Вы превращаете это в регулярное выражение.

Затем, используя оператор алмаза <> который либо читает из <STDIN> либо открывает файлы, перечисленные в командной строке (так что cat $file | ./myscript.pl или ./myscript.pl <filename> )), мы затем читаем каждую строку ,

Мы проверяем наличие этого регулярного выражения в указанном номере столбца (по умолчанию разделяем разделители по пробелам).

Использование grep с помощью PCRE:

 $ grep -P '^[^ ]+\s+dog|cat(?=\s|$)' file.txt email1.com dog email3.com cat 

Это напечатает строки, где dog или cat появляются только во втором столбце линии.