Bash 使用sed筛选列表中的学生

Bash 使用sed筛选列表中的学生,bash,ubuntu,vim,sed,awk,Bash,Ubuntu,Vim,Sed,Awk,我有一个学生列表,我已将其保存到一个文本文件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 pattern命令会打印出专业成绩为a(字母@end)的人,只有名字和姓氏 如果

我有一个学生列表,我已将其保存到一个文本文件
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 pattern命令会打印出专业成绩为a(字母@end)的人,只有名字和姓氏

如果你能链接到一个有用的网站,找到与列表相关的搜索规则,那也很好

使用vim,Ubuntu 16.04不是最合适的工具,最好这样使用: 输出 编辑、过滤工程: 不是最合适的工具,最好这样使用: 输出 编辑、过滤工程:
使用sed查找匹配项,使用awk仅打印所需字段:

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

sed-n表示默认情况下不打印任何内容
/A$/p
表示打印最后一个字符为“A”的任何内容。

使用sed查找匹配项,使用awk仅打印所需字段:

sed -n -e '/A$/p' input_file | awk '{print $1 $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
sed-n表示默认情况下不打印任何内容
/A$/p
表示打印最后一个字符为“A”的任何内容

$ 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
    选项一样
  • -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
    选项一样

使用awk完成。这看起来确实更容易使用awk,是的。非常感谢。最后一个问题:如果需要多个限制,比如他们必须有一个B,并且是在工程中,该怎么办?会使用“&&”操作符吗?@KevinMoy,这对于awk来说同样容易。。例如:
awk'/Engineering/&/B$/{print$1,$2}'
。。。看更多的例子,这里有一种错误。如果你试图用C来获取工科学生的名字,这些脚本将失败,因为Hope Nope的记录只有4个字段。如果数据符合预期,则快速修复方法是将
$5
替换为
$NF
。使用awk完成。这似乎更容易使用awk,是的。非常感谢。最后一个问题:如果需要多个限制,比如他们必须有一个B,并且是在工程中,该怎么办?会使用“&&”操作符吗?@KevinMoy,这对于awk来说同样容易。。例如:
awk'/Engineering/&/B$/{print$1,$2}'
。。。看更多的例子,这里有一种错误。如果你试图用C来获取工科学生的名字,这些脚本将失败,因为Hope Nope的记录只有4个字段。如果数据是预期的,一个快速修复方法是用
$NF
替换
$5
。为什么不仅仅是
awk'/a$/{print$1”“$2}'
?@Sundeep OP要求使用sed,所以我开始使用sed,但后来我意识到他们只需要两个字段,而sed开始变得很难使用。所以,是的,你可能是对的,awk解决方案更好。为什么不干脆
awk'/A$/{print$1”“$2}'
?@Sundeep OP要求使用sed,所以我开始使用sed,但后来我意识到他们只需要两个字段,而sed开始变得很难使用。所以,是的,你可能是对的,awk解决方案更好。