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

use*_*590 6 unix csv awk

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

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

awk -F, '{print $4}' x.CSV > z.csv
Run Code Online (Sandbox Code Playgroud)

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

awk -F\  '{print $1}' z.csv|sort|uniq
Run Code Online (Sandbox Code Playgroud)

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

R S*_*ahu 6

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

awk -F, '{print $4}' x.CSV | awk -F\  '{print $1}' |sort|uniq
Run Code Online (Sandbox Code Playgroud)

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

awk -F, '{print $4}' x.CSV | awk -F\  '{print $1}' | sort -u
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用 , `awk -F, '{print $4}' x.CSV | awk -F\ '{print $1}' |sort -u` (2认同)
  • 你不应该需要两个 `awk` 进程。 (2认同)

Jon*_*ler 6

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

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

split函数在空格上打破字段4,(关联)数组f4记录键值.最后的循环打印出未分类的不同值.如果你需要对它们进行排序,你可以使用GNU awk的内置排序函数,或者(如果你没有awk内置的排序函数)编写你自己的awk,或者输出到输出sort.

使用GNU awk,您可以使用以下代码替换END块:

         END { asorti(f4); for (i in f4) print f4[i] }
Run Code Online (Sandbox Code Playgroud)

如果你不想要z.csv文件,那么(a)你可以在第一时间使用管道,(b)你可以简单地删除该print $4 > "z.csv"行.