【问题标题】:Use awk to print first column, second column and one column every four after that之后使用 awk 打印第一列、第二列和每四列一列
【发布时间】:2015-11-04 04:40:29
【问题描述】:

我有一个文本文件,我想在此之后每 3 列提取第一列、第二列和一列。另外,我想摆脱第 2 行。我如何使用 awk 或类似工具来做到这一点?

一个例子: 我有一个这样的文本文件:

A B C D E F G H I J .. N (header 1)
A B C D E F G H I J .. N (header 2)
A B C D E F G H I J .. N (row 1)
A B C D E F G H I J .. N (row 2)
A B C D E F G H I J .. N (row n)

我正在尝试得到它

A B F J .. N (header 1)
A B F J .. N (row 1)
A B F J .. N (row 2)
A B F J .. N (row n)

谢谢。

附:我尝试过使用How to print every 4th column up to nth column and from (n+1)th column to last using awk? 中提到的解决方案,但该解决方案对我不起作用

【问题讨论】:

    标签: bash awk sed cut


    【解决方案1】:
    $ awk 'NR!=2{out=$1; for (i=2;i<=NF;i+=4) out = out OFS $i; print out}' file
    A B F J 1)
    A B F J 1)
    A B F J 2)
    A B F J n)
    

    上面的输出很混乱,因为您的示例输入中的...s 和 cmets 使其无法测试。始终发布实际的、可测试的输入/输出,而不是此类的描述或其他抽象表示。并且不要在每一行上重复相同的数据,因为这会导致难以将输出字段映射到输入,从而更难理解您的需求。这将是一个更有用的例子:

    $ cat file
    101 102 103 104 105 106 107 108 109 110 111
    201 202 203 204 205 206 207 208 209 210 211
    301 302 303 304 305 306 307 308 309 310 311
    401 402 403 404 405 406 407 408 409 410 411
    
    $ awk 'NR!=2{out=$1; for (i=2;i<=NF;i+=4) out = out OFS $i; print out}' file
    101 102 106 110
    301 302 306 310
    401 402 406 410
    

    【讨论】:

    • 感谢完美。一旦计时器允许,我会接受它。有没有办法添加一个忽略标题的附加子句,如果 $1 (A) 与一组 100 个选项中的任何一个匹配(例如,以某种方式由 OR 符号分隔),awk 只会打印该行,或者更容易将其通过管道输入grep/sed 并使用它?
    • 当然,这是 awk,因此您可以轻松地做任何您想做的事情。不,如果您使用 awk,则永远不需要 sed 和/或 grep,因为 awk 可以做任何这些工具可以做的任何有用的事情。发布一个新问题,因为您的要求现在发生了重大变化,这次请包括经过深思熟虑和可测试的输入/输出。
    • 不得不等待 90 分钟才能发布,但这里是:stackoverflow.com/questions/31952219/…。希望这个例子更好。
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2013-01-26
    相关资源
    最近更新 更多