【问题标题】:Print every nth column of a file打印文件的每第 n 列
【发布时间】:2014-03-12 22:26:35
【问题描述】:

我有一个相当大的文件,其中包含 255 个逗号分隔的列,我只需要每隔三列打印一次。

我正在尝试这样的事情

awk '{ for (i=0;i<=NF;i+=3) print $i }' file

但这似乎不是解决方案,因为它只打印到一长列。有人可以帮忙吗?谢谢

【问题讨论】:

    标签: awk


    【解决方案1】:

    这是一种方法。

    脚本 prog.awk:

    BEGIN {FS = ","} # field separator
    {for (i = 1; i <= NF; i += 3) printf ("%s%c", $i, i + 3 <= NF ? "," : "\n");}
    

    调用:

    awk -f prog.awk <input.csv >output.csv
    

    示例 input.csv:

    1,2,3,4,5,6,7,8,9,10
    11,12,13,14,15,16,17,18,19,20
    

    示例输出.csv:

    1,4,7,10
    11,14,17,20
    

    【讨论】:

    • +1 在 39 秒内击败我!! awk -F, '{for(i=1;i&lt;=NF;i+=2)printf "%s%s", $i, (i+3&gt;NF?"\n":FS)}'
    • 有人能解释一下 (i+3>NF?"\n":FS) 部分吗? @肯特
    • @Kent 如果我们打印最后一项(i + 3 大于字段数),则打印一个换行符。否则,打印一个逗号(字段分隔符)。 NF 是字段数,FS 是字段分隔符。
    【解决方案2】:

    它的行为是这样的,因为默认情况下 将字段拆分为空格。您必须告诉它用逗号分隔它们,并且使用FS 变量或-F 开关完成。除此之外,第一个字段是第一字段。零是整行,所以还要改变for循环的初始值:

    awk -F',' '{ for (i=1;i<=NF;i+=3) print $i }' file
    

    【讨论】:

      猜你喜欢
      • 2023-02-04
      • 2018-09-04
      • 1970-01-01
      • 2017-04-23
      • 2015-01-23
      • 2013-08-23
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多