在单个命令中组合两个awk命令

时间:2014-06-25 04:52:08

标签: unix csv awk

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

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

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

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

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

我想在单个命令中组合这两个命令,我该怎么做?

3 个答案:

答案 0 :(得分:5)

假设实际需要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)在{{{ 1}},或将输出传递给awk

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

END

如果您不想要 END { asorti(f4); for (i in f4) print f4[i] } 文件,那么(a)您可以首先使用管道,(b)您只需删除z.csv行。

答案 1 :(得分:4)

awk '{split($4,b," "); a[b[1]]=1} END { for( i in a) print i }' FS=, x.CSV 

这不会对数据进行排序,但是如果您确实希望对数据进行排序或仅需要获取唯一条目,则不清楚。如果您确实希望对其进行排序,请将其传递给sort

答案 2 :(得分:4)

将第一个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