如何 "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
我的输出看起来像这样:(单词的出现次数,以及单词)
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