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
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
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'/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解决方案更好。