如何"反向"输出bash

时间:2015-04-22 20:38:25

标签: bash sorting cut uniq

我的输出看起来像这样:(单词的出现次数和单词)

    3 I
    2 come
    2 from
    1 Slovenia

但我希望它看起来像这样:

I 3
come 2
from 2
Slovenia 1

我得到了我的输出:

cut -d' ' -f1 "file" | uniq -c | sort -nr

我尝试用另一个管道做不同的事情:

 cut -d' ' -f1 "file" | uniq -c | sort -nr | cut -d' ' -f8 ...?

这是一个好的开始,因为我在第一个地方有这个词。但是我没有访问次数?

不允许使用AWK和SED!

编辑: 好吧,让我们说文件看起来像这样。

I ....
come ...
from ... 
Slovenia ...
I ...
I ....
come ...
from ....

我重复了3次,两次,两次,斯洛文尼亚一次。 +他们在每一行的开头。

3 个答案:

答案 0 :(得分:3)

  

不允许使用AWK和SED!

从这开始:

$ cat file
    3 I
    2 come
    2 from
    1 Slovenia

订单可以通过以下方式撤消:

$ while read count word; do echo "$word $count"; done <file
I 3
come 2
from 2
Slovenia 1

完整管道

让我们从:

开始
$ cat file2
I ....
come ...
from ... 
Slovenia ...
I ...
I ....
come ...
from ....

使用您的管道(有两处更改)与while循环结合使用:

$ cut -d' ' -f1 "file2" | sort | uniq -c | sort -snr | while read count word; do echo "$word $count"; done 
I 3
come 2
from 2
Slovenia 1

我对管道进行的一项更改是在sort之前添加uniq -c。这是因为uniq -c假定其输入已排序。第二个更改是将-s选项添加到第二个排序,以便具有相同计数的单词的字母顺序不会丢失

答案 1 :(得分:0)

您可以在第一次尝试后填写awk

$ cat so.txt
    3 I
    2 come
    2 from
    1 Slovenia

$ cat so.txt | awk '{ print $2 " " $1}'
I 3
come 2
from 2
Slovenia 1

答案 2 :(得分:0)

If perl is allowed:

$ cat testfile
I ....
come ...
from ... 
Slovenia ...
I ...
I ....
come ...
from ....

$ perl -e 'my %list;
           while(<>){
              chomp; #strip \n from the end
              s/^ *([^ ]*).*/$1/; #keep only 1st word
              $list{$_}++; #increment count
           }
           foreach (keys %list){
               print "$_ $list{$_}\n";
           }' < testfile

come 2
Slovenia 1
I 3
from 2