Найти только сопоставленный шаблон в файле CSV

Я пытаюсь напечатать только сопоставленный шаблон в CSV-файле. Пример: все значения столбцов, начинающиеся с 35=its value . Благодарю.

CSV-файл:

 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 

Вывод:

 35=A 35=BCD 35=EF 35=G 

Команда, которую я использовал, не работала:

 sed -n '/35=[AZ]*?/ s/.*\(35=[AZ]*?\).*/\1/p' filename 

  • Как извлечь первый код base64 из файла?
  • Сравнить и объединить конфигурационный файл в CentOS
  • Регулярные команды и команды с командой sed
  • sed: заменить текст строкой, содержащей специальные символы
  • выбор строки из записи в файле
  • Awk / sed извлекает информацию, когда шаблон соответствует абзацу
  • Как «grep» для длины строки в заданном диапазоне?
  • У sed есть функция, превосходящая awk?
  • 5 Solutions collect form web for “Найти только сопоставленный шаблон в файле CSV”

    С GNU grep который поддерживает опцию -o для печати только согласованной строки, каждая на своей собственной линии

     $ grep -oE '\b35=[^,]+' ip.csv 35=A 35=BCD 35=EF 35=G 
    • \b – граница слова, так что 900035 не будет соответствовать
    • [^,]+ для соответствия одному или нескольким символам без символов
    • предполагает, что значения не содержат ,

    С awk

     $ awk -F, '{ for(i=1;i<=NF;i++){if($i~/^35=/) print $i} }' ip.csv 35=A 35=BCD 35=EF 35=G 
    • -F, set , качестве разделителя полей ввода
    • for(i=1;i<=NF;i++) итерация по всем полям
    • if($i~/^35=/) если поле начинается с 35=
      • print $i напечатать это поле

    Подобно perl

     perl -F, -lane 'foreach (@F){print if /^35=/}' ip.csv 

    Используя tr чтобы заменить все запятые на новые строки, а затем grep чтобы получить все строки, начинающиеся со строки 35= :

     $ tr ',' '\n' <data.in | grep '^35=' 35=A 35=BCD 35=EF 35=G 

    С perl:

     $ perl -lne 'print for /(\b35=[^,]+)/g' filename 35=A 35=BCD 35=EF 35=G 

    или, возможно, в целом / с помощью модуля Text :: CSV

     $ perl -MText::CSV -lne ' BEGIN{$p = Text::CSV->new()} print for grep { /^35=/ } $p->fields(), $p->parse($_) ' filename 35=A 35=BCD 35=EF 35=G 

    Perl lookarounds с grep работают очень хорошо.

    grep -oP '(?<=35\=).*?(?=,)'

    Это возвращает точную информацию за вычетом 35= бит

    grep -oP '(?<=35\=).*?(?=,)' file.csv вернет это

    BCD
    г
    EF

    Решение Pure Bash:

     ( # Use parentheses as scope for IFS IFS=$',\n' # Split on both , or \n for c in $(</tmp/file.csv) # For every column or row do [[ "$c" =~ ^35= ]] && echo ${line##35=} # Find ^35= and print while removing ^35= done ) # Optionally >/tmp/filtered-output.txt 

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

     # Read | Replace | Find | Remove cat /tmp/file.csv | tr ',' '\n' | grep '^35=' | sed 's/^35=//' 

    который более интуитивно понятен и эффективен.

    Вход (/tmp/file.csv):

     35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 и 35=A,D=35,C=129,ff=136 D=35,35=BCD,C=129,ff=136 900035=G,D=35,C=129,ff=136 35=EF,D=35,C=129,ff=136,35=G 36=o,D=35,k=1 

    Вывод:

     A BCD EF G 
    Linux и Unix - лучшая ОС в мире.