【问题标题】:selecting specific lines based on second column values根据第二列值选择特定行
【发布时间】:2016-05-24 01:47:04
【问题描述】:

以下是我的test.log文件

a   1020    491 513 1   0   0   52
a   1000    491 513 1   0   0   53
sa  4011    491 513 1   0   0   0
sa  4010    491 513 1   0   0   1
d   1000    508 0   0   0   0   53
d   1020    508 0   0   0   0   52
a   1000    508 513 1   0   0   54
a   1020    508 513 1   0   0   55
sa  4011    508 1026    2   0   0   2
sa  4010    508 1026    2   0   0   3
sd  4010    508 513 1   0   0   1   QIO1
sa  4021    508 513 1   0   0   1
d   1000    525 0   0   0   0   54
d   1020    525 0   0   0   0   55
sd  4021    525 0   0   0   0   1   QIO2
a   1000    525 513 1   0   0   57
a   1020    525 513 1   0   0   56
sa  4010    525 1026    2   0   0   5
sa  4011    525 1539    3   0   0   4
sd  4011    525 1026    2   0   0   0   QIO1
sa  4021    525 513 1   0   0   0
d   1000    542 0   0   0   0   57
sd  4021    542 0   0   0   0   0   QIO2
d   1020    542 0   0   0   0   56

我只想提取(第一列 = sa 或 sd)和第二列等于 4010 和 4011 的行。我尝试了以下命令。

cat test.log | grep "sa\|sd" | awk '{if ($2 = "4010"|| $2 ="4011")print}'

但它给了我错误的输出。

我的预期输出是

sa  4011    491 513 1   0   0   0
sa  4010    491 513 1   0   0   1
sa  4011    508 1026    2   0   0   2
sa  4010    508 1026    2   0   0   3
sd  4010    508 513 1   0   0   1   QIO1
sa  4010    525 1026    2   0   0   5
sa  4011    525 1539    3   0   0   4
sd  4011    525 1026    2   0   0   0   QIO1

有人可以建议我哪里出错了。谢谢

【问题讨论】:

    标签: awk


    【解决方案1】:

    要习惯用语,我的朋友:

    awk '$1 ~ /^s(a|d)$/ && $2 ~ /^401[01]$/' file
    #         ^^^^^^^^^           ^^^^^^^^^
    #         sa or sd            4010 or 4011
    

    返回:

    sa  4011    491 513 1   0   0   0
    sa  4010    491 513 1   0   0   1
    sa  4011    508 1026    2   0   0   2
    sa  4010    508 1026    2   0   0   3
    sd  4010    508 513 1   0   0   1   QIO1
    sa  4010    525 1026    2   0   0   5
    sa  4011    525 1539    3   0   0   4
    sd  4011    525 1026    2   0   0   0   QIO1
    

    【讨论】:

    • 谢谢您的解释
    • @user2532296 我希望很清楚。注意awk '{if (condition) print}'之类的东西可以压缩成awk 'condition'
    • 为什么是(a|d)[01]?恕我直言[ad] 会更有意义。
    【解决方案2】:

    您可以完全在 grep 中完成此操作:

    $ grep -E '^s[ad]\s+401[01]' file
    sa  4011    491 513 1   0   0   0
    sa  4010    491 513 1   0   0   1
    sa  4011    508 1026    2   0   0   2
    sa  4010    508 1026    2   0   0   3
    sd  4010    508 513 1   0   0   1   QIO1
    sa  4010    525 1026    2   0   0   5
    sa  4011    525 1539    3   0   0   4
    sd  4011    525 1026    2   0   0   0   QIO1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多