Linux Awk-如何剪切一行,检查一列是否匹配,打印另一列?

Linux Awk-如何剪切一行,检查一列是否匹配,打印另一列?,linux,bash,shell,unix,awk,Linux,Bash,Shell,Unix,Awk,我有一个像这样的LaaaArge文件: VENDOR|QTY|ITEM|PRICE 2|3|Sugar|15 3|3|Coffee|35 4|244|Sugar2|55 33|2|Pizza|36 3|3|Pizza|55 5|5|Pizza2|33 6|6|Pizza3|44 如何打印供应商和价格 我试过grep,但速度很慢 我可以像这样编写python代码 for line in file: fields = line.split('|') if fields[2] ==

我有一个像这样的LaaaArge文件:

VENDOR|QTY|ITEM|PRICE
2|3|Sugar|15
3|3|Coffee|35
4|244|Sugar2|55
33|2|Pizza|36
3|3|Pizza|55
5|5|Pizza2|33
6|6|Pizza3|44
如何打印供应商和价格

我试过grep,但速度很慢

我可以像这样编写python代码

for line in file:
    fields = line.split('|')
    if fields[2] == 'Pizza':
        print fields[0], fields[-1]
但我想用外壳本身的Awk来做。我该怎么做

更新

如何检查子字符串呢

如果比萨饼出现在
项目中,我想输出
供应商
价格

输出应为:

33|36
3|55
5|33
6|44
因此:

$ awk -F\| '$3=="Pizza" {print $1,$4}' file
33 36
3 55
解释
  • -F\|
    |
    设置为字段分隔符
  • $3==“Pizza”
    检查第三个字段是否为“Pizza”
  • {print$1,$4}
    打印第一个和第四个字段

更新 如果比萨饼出现在
项目中,我想输出
供应商
价格

解释
  • $3~/Pizza/
    检查“发生”,以及
    $3==“Pizza
    检查精确匹配
  • BEGIN{OFS=FS=“|”}
    将(输入和输出)字段分隔符设置为
    |

将在11分钟内接受:)这也是最有效的方法吗?因为我也在寻找速度:)我认为这是非常有效的。无论如何,一些专家可能会提供更好的解决方案,可能是在
sed
中。然后你可以在命令前使用
时间
比较他们的效率。注意,我更新了我的答案,以便输出是用
|
编写的,我错过了更新的那部分:)
$ awk 'BEGIN{OFS=FS="|"} $3~/Pizza/ {print $1,$4}' file
33|36
3|55
5|33
6|44