【问题标题】:Combining two awk commands in single command在单个命令中组合两个 awk 命令
【发布时间】:2014-08-15 12:42:25
【问题描述】:

我想结合这两个命令并想调用单个命令

在第一个命令中,我将 x.csv(Separator ,) 文件的第 4 列存储在 z.csv 文件中。

awk -F, '{print $4}' x.CSV > z.csv

在第二个命令中,我想找出 z.csv(Separator-space) 文件的唯一第一列值。

awk -F\  '{print $1}' z.csv|sort|uniq

我想将这两个命令合并到一个命令中,我该怎么做?

【问题讨论】:

    标签: unix csv awk


    【解决方案1】:
    awk '{split($4,b," "); a[b[1]]=1} END { for( i in a) print i }' FS=, x.CSV 
    

    这不会对数据进行排序,但不清楚您是真的希望它排序还是仅仅需要它来获得唯一条目。如果您确实希望对其进行排序,请将其通过管道发送到 sort

    【讨论】:

    • 我认为您稍微误读了这个问题;字段 4 在空格上分割,而不是斜线。您也不会将$4 打印到z.csv,但这也很容易解决。
    • 谢谢,乔纳森,这确实是问题中的反斜杠。我假设在 z.csv 中存储数据实际上并不是期望的副作用(类似于排序)。
    • 目前尚不清楚z.csv 是真正需要还是只是一个副作用。由于可以使用管道,因此我倾向于“需要它”,但这远非确定。
    • 如果我不使用排序关键字而不是我无法获得不同的条目,所以我使用排序关键字...x.csv 文件中的分隔符是 ',' 但 x.csv 文件的第 4 列再次与“空格”分开,所以我只想要 x.csv 文件的第 4 列的第 1 列(由空格分隔)中的不同条目。
    【解决方案2】:

    将第一个awk 的输出通过管道传输到第二个awk

    awk -F, '{print $4}' x.CSV | awk -F\  '{print $1}' |sort|uniq
    

    或者,正如 Avinash Raj 建议的那样,

    awk -F, '{print $4}' x.CSV | awk -F\  '{print $1}' | sort -u
    

    【讨论】:

    • 你可以使用,awk -F, '{print $4}' x.CSV | awk -F\ '{print $1}' |sort -u
    • @AvinashRaj 好建议。谢谢。
    • 你不应该需要两个awk 进程。
    • @JonathanLeffler,你是对的。有时我喜欢以几个 CPU 周期为代价的代码简单性:)
    • 我认为问题的重点是避免使用两个不同的 awk 进程!
    【解决方案3】:

    假设z.csv 的内容实际上是需要的,而不仅仅是您当前实现程序的方式的人工制品,那么您可以使用:

    awk -F, '{ print $4 > "z.csv"
               split($4, f, " ")
               f4[f[1]] = 1
             }
             END { for (i in f4) print i }' x.CSV
    

    split 函数在空格上断开字段 4,并且(关联)数组 f4 记录键值。最后的循环打印出未排序的不同值。如果您需要对它们进行排序,您可以使用 GNU awk 的内置排序功能,或者(如果您没有带有内置排序功能的 awk)在 awk 中编写您自己的,或者使用管道输出到sort

    使用 GNU awk,您可以将 END 块替换为:

             END { asorti(f4); for (i in f4) print f4[i] }
    

    如果您不想要 z.csv 文件,那么 (a) 您可以首先使用管道,并且 (b) 您可以简单地删除 print $4 > "z.csv" 行。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 2012-04-02
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多