【问题标题】:Awk - How to cut a line, check if a column matches something, print another column?Awk - 如何剪断一行,检查一列是否匹配,打印另一列?
【发布时间】:2013-09-27 09:45:55
【问题描述】:

我有一个像这样的 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 中执行此操作。我该怎么做?

更新

如何也检查子字符串?

如果ITEM中出现Pizza,我想输出VENDORPRICE

输出应该是:

33|36
3|55
5|33
6|44

【问题讨论】:

    标签: linux bash shell unix awk


    【解决方案1】:

    这使得它:

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

    说明

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

    更新

    如果ITEM中出现Pizza,我想输出VENDORPRICE

    $ 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="|"} 将(输入和输出)字段分隔符设置为 |

    【讨论】:

    • 将在 11 分钟内接受 :)
    • 这也是最有效的方法吗?因为我也在寻找速度:)
    • 我认为这非常有效。无论如何,一些大师可能会提供更好的解决方案,也许在sed。然后你可以在命令前使用time比较它们的效率。
    • 注意我更新了我的答案,所以输出是用|写的,我错过了你更新的那部分:)
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 2018-01-07
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多