仅在 CSV 文件中查找匹配的模式

use*_*299 5 sed awk perl text-processing

我正在尝试仅在 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
Run Code Online (Sandbox Code Playgroud)

输出:

35=A
35=BCD
35=EF
35=G
Run Code Online (Sandbox Code Playgroud)

我使用的命令不起作用:

sed -n '/35=[A-Z]*?/ s/.*\(35=[A-Z]*?\).*/\1/p' filename
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 14

使用tr来替换换行符的所有逗号,然后grep获得以字符串开头的所有行35=

$  tr ',' '\n' <data.in | grep '^35='
35=A
35=BCD
35=EF
35=G
Run Code Online (Sandbox Code Playgroud)


Sun*_*eep 12

使用GNU grepwhich 支持-o选项只打印匹配的字符串,每个都在自己的行上

$ grep -oE '\b35=[^,]+' ip.csv 
35=A
35=BCD
35=EF
35=G
Run Code Online (Sandbox Code Playgroud)
  • \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
Run Code Online (Sandbox Code Playgroud)
  • -F,设置,为输入字段分隔符
  • for(i=1;i<=NF;i++) 遍历所有字段
  • if($i~/^35=/) 如果字段以 35=
    • print $i 打印该字段

与......类似 perl

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


ste*_*ver 6

使用 perl:

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

或者更普遍/更有效地使用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
Run Code Online (Sandbox Code Playgroud)