如何 "reverse" 输出 bash

how to "reverse" the output bash

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

    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次,来了两次,来自两次,斯洛文尼亚一次。 +它们在每一行的开头。

您可以在第一次尝试后通过管道输入 awk

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

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

AWK and SED are not allowed!

从这里开始:

$ 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

我对管道所做的一项更改是在 uniq -c 之前放置一个 sort。这是因为 uniq -c 假定其输入已排序。第二个变化是在第二个排序中添加-s选项,这样计数相同的单词的字母顺序就不会丢失

如果允许 perl:

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

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

come 2
Slovenia 1
I 3
from 2