Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计数、带sed的groupby或awk_Awk_Sed - Fatal编程技术网

计数、带sed的groupby或awk

计数、带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

我想根据每一行的内容对一个文件执行两种不同的排序和计数。 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
结果:

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更新为该版本