【问题标题】:Change the order of columns in the output of `uniq -c`更改 `uniq -c` 输出中的列顺序
【发布时间】:2020-09-13 16:38:03
【问题描述】:

我正在使用此脚本读取文件并向我显示文件中的唯一名称,并显示此名称在文件中存在的次数(计数)

john
john
William
wad
William
john
wad
john
wad
john
William
john
wad
john
wad
wad
john
john

cat student.txt | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10

它的输出:

9 John
6 Wad
3 William

我想改变这种格式,我想先名字然后计数,我怎么能用上面的脚本做到这一点

 John 9
 Wad 6
 William 3

【问题讨论】:

标签: bash shell sh uniq


【解决方案1】:

附加到您的命令:

| awk '{print $2,$1}'

【讨论】:

  • 你尝试了什么?
  • 这个 awk '{print $2,$1}'
  • 使用:cat student.txt | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10 | awk '{print $2,$1}'
  • @Kashif :正如您在自己的帖子中指出的那样,管道的输出有两列,例如 John 9
【解决方案2】:

你的管道太长了。 awk 有为此目的的关联数组:

$ awk '{++count[$1]} END {for (name in count) print name, count[name]}' student.txt |
sort -nr -k 2
john 9
wad 6
William 3

【讨论】:

    【解决方案3】:

    使用 Perl: 计算每个输入行出现次数的命令,将输出从最频繁到最不频繁排序,并打印每行后跟计数(制表符分隔):

    echo William Wad John William John William William | xargs -n1 | \
        sort | uniq -c | sort -nr | \
        perl -lane 'print join "\t", reverse @F'
    

    打印:

    William 4
    John    2
    Wad     1
    

    Perl 单行程序使用这些命令行标志:
    -e:告诉 Perl 查找内联代码,而不是在文件中。
    -n:循环输入一行一次,默认将其分配给$_
    -l:在执行内联代码之前剥离输入行分隔符(默认为 *NIX 上的"\n"),并在打印时附加它。-a : 在空格或-F 选项中指定的正则表达式上将$_ 拆分为数组@F

    print join "\t", reverse @F:从右到左阅读:反转数组@F(输入字段),将选项卡上的元素连接成一个字符串,然后打印该字符串。

    要将制表符替换为空白,请使用:
    print join " ", reverse @F

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多