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

Попробуйте этот AWK!

awk '{a[$0]++} END {for (x in a) if (a[x] == 1) print x}'
5
13.06.2017, 16:41
5 ответов

С 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
6
27.01.2020, 20:31

Осмотр Perl с grep работает очень хорошо.

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

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

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

A
BCD
Г
EF

2
27.01.2020, 20:31

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

$  tr ',' '\n' <data.in | grep '^35='
35=A
35=BCD
35=EF
35=G
14
27.01.2020, 20:31

Чистое решение 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

Вывод:

A
BCD
EF
G
0
27.01.2020, 20:31

С 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, установить , в качестве разделителя полей ввода
  • for(i=1;i<=NF;i++) перебрать все поля
  • if($i ~/^35=/) если поле начинается с 35=
    • напечатайте $i напечатайте это поле

Аналогично perl

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

Теги

Похожие вопросы