使用 sed 过滤列表中的学生

问题描述 投票:0回答:3

我有一份学生名单,我已将其保存到文本文件中

students.txt

John Doe Marketing Junior B
Betty Metty Engineering Junior A
James Names Nursing Sophomore B
Bob Nob History Freshman B
Hope Nope Engineering C

这可能非常简单,但由于我是 shell 脚本编写的初学者,什么 sed 模式命令可以打印出专业为 A(字母@结尾)的人,仅名字和姓氏?

如果您可以链接一个有用的网站来获取与列表相关的 sed 模式搜索规则,那就太好了。

使用vim,Ubuntu 16.04

bash ubuntu vim sed
3个回答
6
投票

sedawk

awk '$5=="A"{print $1, $2}' file
输出

Betty Metty
编辑、过滤“engineering”字符串:

awk '$5=="A" && $3=="Engineering"{print $1, $2}' file
    

2
投票
$ cat ip.txt John Doe Marketing Junior B Betty Metty Engineering Junior A James Names Nursing Sophomore B Bob Nob History Freshman B Hope Nope Engineering C $ sed -nE '/A$/ s/^(\S+\s+\S+).*/\1/p' ip.txt Betty Metty

  • -n
     默认不打印行
  • -E
    使用扩展正则表达式
  • /A$/
     匹配行尾的 
    A
     
  • s/^(\S+\s+\S+).*/\1/p
     捕获由空格分隔的前两个非空格字符序列,省略行的其余部分并打印此修改后的行
使用 GNU

sed

,用于就地编辑:

sed -i -nE '/A$/ s/^(\S+\s+\S+).*/\1/p' ip.txt


vim



:v/A$/d | s/\v^(\S+\s+\S+).*/\1/

  • v/A$/d
     删除所有不以 
    A
     结尾的行
    
  • |
     添加另一个命令
  • s/\v^(\S+\s+\S+).*/\1/
    使用非常神奇的模式
    \v
    来减少所需的
    \
    ,就像
    -E
    选项
    一样

0
投票
使用 sed 查找匹配项并使用 awk 只打印您想要的字段:

sed -n -e '/A$/p' input_file | awk '{print $1 $2}'

sed -n 表示默认情况下不打印任何内容。

/A$/p

 表示打印最后一个字符为“A”的任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.