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

时间:2013-09-27 09:45:55

标签: linux bash shell unix awk

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

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

如何打印VENDORPRICE IFF ITEMPizza

我已经尝试了grep,但速度很慢。

我可以像这样编写一个python代码,

for line in file:
    fields = line.split('|')
    if fields[2] == 'Pizza':
        print fields[0], fields[-1]

但我想从shell本身的 Awk 中做到这一点。我该怎么做?

更新

我如何检查子串?

如果<{1}}中出现披萨,我想输出VENDORPRICE

输出应为:

ITEM

1 个答案:

答案 0 :(得分:11)

这就是:

$ awk -F\| '$3=="Pizza" {print $1,$4}' file
33 36
3 55

解释

  • -F\||设置为字段分隔符。
  • $3=="Pizza"检查第3个字段是否为“Pizza”。
  • {print $1,$4}打印第1和第4个字段。

更新

  

如果<{1}}中出现披萨,我想输出VENDORPRICE

ITEM

解释

  • $ awk 'BEGIN{OFS=FS="|"} $3~/Pizza/ {print $1,$4}' file 33|36 3|55 5|33 6|44 检查“发生”,以及$3~/Pizza/检查完全匹配。
  • $3=="Pizza将(输入和输出)字段分隔符设置为BEGIN{OFS=FS="|"}
相关问题