在第二行数据的 awk 中使用 sort 和 Uniq -C



有很多类似的问题,但它们(我见过的(都对第一行数据中的重复字符串进行排序和计数感兴趣。就我而言,我需要将第一行保持完整并放在顶部,同时为以下所有行调用sort | uniq -c。我已经到了排序部分,我唯一坚持的部分是uniq -c部分。我尝试过管道,调用system("uniq -c"),其他system(...)组合,但似乎没有任何效果。我当前的命令行如下所示,但它只到达排序部分:

myProgram input_file other_input_file | awk 'NR<2{print $0;next}{print $0 | "sort"}'

从中我得到:

Id: revision_data  #this needs to stay on top
0
0
10.1007/S00253-012-4050-Z
10.1007/S00775-006-0142-5
10.1021/ACS.BIOCHEM.5B00958
10.1021/BI020286F
10.1038/35422
10.1093/NAR/28.8.1743
10.1093/NAR/GKN245
10.7554/ELIFE.00813

而我需要的是这个:

Id: revision_data
2 0
1 10.1007/S00253-012-4050-Z
1 10.1007/S00775-006-0142-5
1 10.1021/ACS.BIOCHEM.5B00958
1 10.1021/BI020286F
1 10.1093/NAR/28.8.1743
1 10.1093/NAR/GKN245
1 10.7554/ELIFE.00813

如何将uniq -c插入到我的命令中以获取所需的输出?

您可以使用此gnu awk

awk 'NR == 1 { print; next } { ++freq[$0] } END {
PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in freq) print freq[i], i }' file

Id: revision_data
2 0
1 10.1007/S00253-012-4050-Z
1 10.1007/S00775-006-0142-5
1 10.1021/ACS.BIOCHEM.5B00958
1 10.1021/BI020286F
1 10.1038/35422
1 10.1093/NAR/28.8.1743
1 10.1093/NAR/GKN245
1 10.7554/ELIFE.00813

因此,只需保存第一行,输出它,然后继续您的脚本。

{
IFS= read -r firstline
printf "%sn" "$firstline"
sort | uniq -c
} < input_file

您可以将文件的第一行与应用于其他行的命令连接起来。

例如:

cat <(head -n1 文件名( <(sort <(tail -n+2 文件名( | uniq -c(

这会将sort | uniq -c应用于从第二行开始的所有行(通过tail -n+2(。 它使用cat连接到第一行(通过head -n1(。

最新更新