在第二行数据中使用awk中的sort和uniq -c

问题描述 投票:0回答:3

有很多与此类似的问题,但是(我已经看到)他们都对从第一行数据开始的重复字符串进行排序和计数感兴趣。在我的情况下,我需要保留第一行并保持在最上面,同时为随后的所有行调用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以获取所需的输出?

bash sorting awk uniq
3个回答
0
投票

所以只保存第一行,输出它,然后继续执行脚本。

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

0
投票

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

例如:

cat

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


0
投票

您可以使用此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
© www.soinside.com 2019 - 2024. All rights reserved.