Shell 如何使用awk过滤复杂的线?
我有一个具有以下语法的文件:Shell 如何使用awk过滤复杂的线?,shell,awk,Shell,Awk,我有一个具有以下语法的文件: 键1 |键2 |键31:value31,键32:value32,…|键4 我想在第三部分中过滤所有具有特定键和值的行 例如,在下面的测试中,我希望筛选年龄=13的所有行,我更希望用户输入$3进行筛选,例如使用键年龄和年龄>=15。 获得| 20150715 |年龄:13,身高:11,宽度:12 |迈克 邮政| 20150715 |年龄:13岁,宽度:11 |汤姆 获取| 20150715 |高度:11,宽度:11 |莉莉 我可以用awk来做这件事吗?快速肮脏
键1 |键2 |键31:value31,键32:value32,…|键4
我想在第三部分中过滤所有具有特定键和值的行
例如,在下面的测试中,我希望筛选年龄=13的所有行,我更希望用户输入$3进行筛选,例如使用键年龄和年龄>=15。
获得| 20150715 |年龄:13,身高:11,宽度:12 |迈克
邮政| 20150715 |年龄:13岁,宽度:11 |汤姆
获取| 20150715 |高度:11,宽度:11 |莉莉
我可以用awk来做这件事吗?快速肮脏的方式:
awk -F'|' '$3~/age:13/' file
它是“脏”的,因为如果某人足够大,比如说age:135
,它也会被列出,如果age:13
中没有age:13
,但是package:13
行也会被输出。但这一行是快速拍摄,你可以尝试,如果它适用于你的真实数据
更新新要求:
既然OP说他有gnu awk可用,这条线应该可以工作:
awk -F'|' -v value="12"
'$3~/age:/{v=gensub(".*age:([0-9]*).*","\\1","G",$3);if(v>value)print}' file
- 您可以将
更改为要检查的值条件,例如-v value=“12”
15、17….
- 这一行将输出年龄:value(在第3列中)大于给定值的行
- 如果要检查较小的,等于。。。您可以更改
检查if(v…值)
这里是一个测试,使用一行年龄值
从您的输入文件中提供示例数据并显示一些尝试。我是awk新手,我只能使用awk$3获得第三部分,即年龄:13,高度:11,宽度:12
,在第一行,但我不知道下一步要做什么。感谢您的回复,我可能需要一些更高级的功能,对于年龄大于等于13岁的exmaple。我可以用正则表达式来实现它吗?我知道awk可以用$I来过滤行。在我的例子中,它有点像嵌套的awk,首先得到3美元,然后分割它并测试每个部分,最后打印整行。我对shell和awk是新手,我不知道如何实现它。@Jayce你应该在发布问题时把所有的要求都放在你的问题中。不通过编辑添加新需求,这将使所有答案都失败。谁知道在我更新后是否还有新的要求……对不起,在对你的答案发表评论之后,我已经更新了我的问题。对不起。@Jayce你有gnu awk吗?
kent$ cat f
GET|20150715|age:13,height:11,width:12|Mike
xxxGET|20150715|age:10,height:11,width:12|Mike
POST|20150715|age:13,width:11|Tom
GET|20150715|height:11,width:11|Lily
kent$ awk -F'|' -v value="12" '$3~/age:/{v=gensub(".*age:([0-9]*).*","\\1","G",$3);if(v>value)print}' f
GET|20150715|age:13,height:11,width:12|Mike
POST|20150715|age:13,width:11|Tom