Найти только сопоставленный шаблон в файле 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 

  • Передача переменной sed
  • Усекать конечные запятые из каждой строки на основе 1-го поля в файле с разделителями
  • Удалить все узлы <FOLDER>! = Значение тега
  • Замена конца слова чем-то еще
  • Как изменить конкретный столбец с помощью 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 
    Interesting Posts

    Почему учетная запись пользователя на удаленном сервере называется учетной записью оболочки

    Как заставить процесс работать в фоновом режиме, даже если он отказывается?

    Редакторы Nano / VIM не используют ресурсы

    Загрузка только что скомпилированного ядра Linux

    Autokey не запустится

    Необходимо отключить комментарии в двойных кавычках

    Есть ли способ использовать выражения регулярных выражений для автоматического заполнения имен файлов в bash?

    Выясните, используется ли моя система в качестве бота, если посмотреть на ifconfig?

    Каков максимальный диапазон символов grep в bash?

    Как удалить каталог символьных ссылок ссылки плюс символическая ссылка?

    Изменение файла хоста в Ubuntu

    Что может прерывать выполнение потоков, привязанных к ядрам?

    SSH отключается при блокировке экрана с помощью vlock

    mysql не запускает ошибки bash_completion

    Qubes OS через VM?

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