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)
使用 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)