计数、带sed的groupby或awk
我想根据每一行的内容对一个文件执行两种不同的排序和计数。 1.我需要获取计数、带sed的groupby或awk,awk,sed,Awk,Sed,我想根据每一行的内容对一个文件执行两种不同的排序和计数。 1.我需要获取.tsv文件的第一列 我想按每一行以三位数字开始分组,只保留前三位数字,对于其他所有内容,只需对第一列中出现的整个句子进行排序和计数 样本数据: 687/878 9 890987 4 01a 55 1b 8743917 890a 34 abcdee 987 dfeqfe fkdjald 890897 34213 6878853 834 32fasd 53891 abcdee 8794371 abd 873
.tsv
文件的第一列
我想按每一行以三位数字开始分组,只保留前三位数字,对于其他所有内容,只需对第一列中出现的整个句子进行排序和计数
样本数据:
687/878 9
890987 4
01a 55
1b 8743917
890a 34
abcdee 987
dfeqfe fkdjald
890897 34213
6878853 834
32fasd 53891
abcdee 8794371
abd 873
结果:
687 2
890 3
01a 1
1b 1
32fasd 1
abd 1
dfeqfe 1
abcdee 2
我也希望有一个能够
还应考虑以下示例输入:
687/878 9
890987 4
01a 55
1b 8743917
890a 34
abcdee 987
dfeqfe 545
890897 34213
6878853 834
(632)fasd 53891
(88)abcdee 8794371
abd 873
因此,第一列可能有类似(,),#,',的值,所有类型的字符
因此,输出将有两列,第一列包含提取的值,第二列包含从源文件提取的新值
还是首选输出格式tsv
所以我需要提取所有以
^\d\d\d,然后对前三位数字的唯一值进行排序和计数
但在第二次传递中,对每一行也执行相同的操作,即不以3位数字开头,但这一次,保留整列值并按其排序计数
我所尝试的:
| sort | uniq-c | sort-nr
对于以^\d\d\d开头的行,以及
对于那些不满足上述正则表达式的函数也是如此,但是有没有更优雅的方法使用sed
或awk
?您可以尝试Perl
$ cat nefijaka.txt
687 878 9
890987 4
890a 34
abcdee 987
$ perl -lne ' /^(\d{3})|(\S+)/; $x=$1?$1:$2; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt
687 1
890 2
abcdee 1
$
您可以通过管道对其进行排序,并对值进行排序
$ perl -lne ' /^(\d{3})|(\S+)/; $x=$1?$1:$2; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt | sort -k2 -nr
890 2
abcdee 1
687 1
编辑1:
$ cat nefijaka.txt2
687 878 9
890987 4
890a 34
abcdee 987
a word and then 23
$ perl -lne ' /^(\d{3})|(.+?\t)/; $x=$1?$1:$2; $x=~s/\t//g; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt2
687 1
890 2
a word and then 1
abcdee 1
$
你可以试试Perl
$ cat nefijaka.txt
687 878 9
890987 4
890a 34
abcdee 987
$ perl -lne ' /^(\d{3})|(\S+)/; $x=$1?$1:$2; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt
687 1
890 2
abcdee 1
$
您可以通过管道对其进行排序,并对值进行排序
$ perl -lne ' /^(\d{3})|(\S+)/; $x=$1?$1:$2; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt | sort -k2 -nr
890 2
abcdee 1
687 1
编辑1:
$ cat nefijaka.txt2
687 878 9
890987 4
890a 34
abcdee 987
a word and then 23
$ perl -lne ' /^(\d{3})|(.+?\t)/; $x=$1?$1:$2; $x=~s/\t//g; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt2
687 1
890 2
a word and then 1
abcdee 1
$
为什么这更复杂?我只看到一个级别的组。简而言之,
awk-F'\t'/^[0-9]{3}/{a[substr($1,1,3)]++;next}{a[$1]+}END{etc etc}
有两个组,一个组的值为^[0-9]{3},另一个组的值为所有剩余行的全部值,与^[0-9]{3}不匹配我也希望你能采用awk或sed方法。那么你不应该接受你得到的第一个答案,因为这会阻止人们提供更多的答案,因为你可能已经不再阅读这些答案了。为什么这会更复杂呢?我只看到一个级别的组。简而言之,awk-F'\t'/^[0-9]{3}/{a[substr($1,1,3)]++;next}{a[$1]+}END{etc etc}
有两个组,一个组的值为^[0-9]{3},另一个组的值为所有剩余行的全部值,与^[0-9]{3}不匹配我也很感激awk或sed方法。那么你不应该接受你得到的第一个答案,因为这会阻止人们提供更多的答案,因为你可能不再阅读它们了。只需管道| sort-k2-nr
。检查我的更新答案以上看起来不错,只要我能排序结果不是按键,而是按发现的事件,如果它能考虑到我在某些单词值中也有一个空格。例如,aa bb cc你是说样本输入中的“aa bb cc”像“abcdee”吗?@stack0114106 OP描述中的两段,从开始,所以我需要——接近结尾。@nefijaka。。请提供2组方案的示例输入。。我将把asnwer更新到这个位置,只要pipe| sort-k2-nr
。检查我的更新答案以上看起来不错,只要我能排序结果不是按键,而是按发现的事件,如果它能考虑到我在某些单词值中也有一个空格。例如,aa bb cc你是说样本输入中的“aa bb cc”像“abcdee”吗?@stack0114106 OP描述中的两段,从开始,所以我需要——接近结尾。@nefijaka。。请提供2组方案的示例输入。。我也会将asnwer更新为该版本