Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何使用awk过滤复杂的线?_Shell_Awk - Fatal编程技术网

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