如何在linux下使用awk命令获取输出

如何在linux下使用awk命令获取输出,linux,awk,Linux,Awk,我正在尝试打印带分隔符的awk命令的输出。 尝试使用cut获得相同的输出 cat File1 dot|is-big|a dot|is-round|a dot|is-gray|b cat|is-big|a hot|in-summer|a dot|is-big|a dot|is-round|b dot|is-gray|a cat|is-big|a hot|in-summer|a 已尝试的命令: $awk 'BEGIN{FS="|"; OFS=","} {print $1,$3}' file1.c

我正在尝试打印带分隔符的awk命令的输出。 尝试使用cut获得相同的输出

cat File1
dot|is-big|a
dot|is-round|a
dot|is-gray|b
cat|is-big|a
hot|in-summer|a
dot|is-big|a
dot|is-round|b
dot|is-gray|a
cat|is-big|a
hot|in-summer|a
已尝试的命令:

$awk 'BEGIN{FS="|"; OFS=","} {print $1,$3}'  file1.csv | sort |  uniq -c
获得的输出:

  2 cat,a
  4 dot,a
  2 dot,b
  2 hot,a
期望输出:

  2,cat,a
  4,dot,a
  2,dot,b
  2,hot,a
尝试了几个其他命令:

$cat file1.csv |cut --output-delimiter="|"  -d'|' -f1,3 | sort | uniq -c

在运行uniq-c之后,您需要将分隔符更改为,因为它将添加第一列

awk -F'|' '{print $1, $3}' file1.csv | sort | uniq -c | awk 'BEGIN{OFS=","} {$1=$1;print}'
但是如果您使用的是awk,则不需要使用sort | uniq-c,它可以自己进行计数

awk 'BEGIN{FS="|";OFS=","} {a[$1 OFS $3]++} END{for(k in a) print a[k], k}' file1.csv

问题是空间是由uniq-c放入的,在awkexpand之后执行,这个问题与awk无关。不幸的是,uniq-c不允许指定delimeter,因此使用一些正则表达式,并用逗号ex.sed替换行中第一个数字后的第一个空格。您可以在awk中跟踪计数,而不必调用uniq。例如,awk'{a[$1,$3]+}END{fori在打印中a[i],i}'FS=\\\\\| OFS=,file1.csv | sort-t,-k2posix是否保证a中的k以适当排序的顺序迭代?排序不是一个gawk扩展吗?这就像预期的那样工作{awk-F'|''''{print$1,$3}'file1.csv{sort}uniq-c | awk'BEGIN{OFS=,}{$1=$1;print}}。但是有没有一种方法可以优化像count:2,Subject:cat,Category:a,count:4,Subject:dot,Category:a,count:2,Subject:cat,Category:b,count:2,Subject:hot,Category:a这样的输出?这看起来就像JSON,为什么不使用像jq这样的实用程序来生成真正的JSON呢?您可以使用我的第二个方法,并更改结束块,以您想要的格式打印它。