【问题标题】:Printing lines if a specific column contains values >0如果特定列包含值 >0,则打印行
【发布时间】:2016-02-12 14:13:30
【问题描述】:

我有一个这种格式的制表符分隔的 .txt 文件,其中包含许多符号、数字和字母:

MUT 124 GET 288478  0   *       =   288478  0
MUT 15  GET 514675  0   75MH    =   514637  -113
MUT 124 GET 514637  0   75MH    =   514675  113

我想识别第 9 列中包含 >0 值的所有行(即仅提取上面的第 3 行),然后从任何匹配的行中打印第 4 + 9 列。

所需的输出(两列制表符分隔的 .txt 文件):

514637    113

有没有一种快速的方法可以在终端/命令行中执行此操作。如果有,怎么做?

我才刚刚开始学习 awk 和 perl,所以到目前为止我所有的尝试都还差得很远。不知道从哪里开始!

【问题讨论】:

  • 你可以很容易地用 awk 做到这一点。展示你的一些尝试并解释它们是如何失败的。

标签: perl shell unix text awk


【解决方案1】:

在 Perl 中很容易

perl -lane 'print "$F[3]\t$F[8]" if $F[8] > 0' < input-file
  • -l 为您打印的所有内容添加换行符
  • -a 将输入拆分为 @F 数组
  • -n逐行处理输入

【讨论】:

    【解决方案2】:

    可以通过Perl one-liner

    $ perl -anE 'say join "\t", @F[3,8] if $F[8] > 0' data.txt
    
    • -n(非自动打印)- 遍历行,读取但不打印它们
    • -a(自动拆分)- 将存储在$_ 中的输入行拆分为@F 数组(空格是默认分隔符,将其更改为-F,例如-F:
    • -E 'CODE'(执行)- 为您的 Perl 版本执行 'CODE' 启用功能包(如 use 5.010

    请参阅perlrun 了解更多信息。

    【讨论】:

      【解决方案3】:

      awk 几乎自动处理!

      awk '$9>0 {print $4,$9}' file
      

      如果需要指定输入输出分隔符,说:

      awk 'BEGIN{FS=OFS="\t"} $9>0 {print $4,$9}' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 2016-12-14
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多