在第二行数据的 awk 中使用 sort 和 uniq -c
using sort and uniq -c in awk from second line of data
类似这样的题还有很多,但是(我看过的)都是对从第一行数据开始的重复字符串进行排序统计。在我的例子中,我需要保留第一行并保持在最上面,同时为以下所有行调用 sort | uniq -c
。我已经到了排序部分,我唯一坚持的部分是 uniq -c
部分。我试过管道,调用 system("uniq -c")
,system(...)
的其他组合,但似乎没有任何效果。我当前的命令行看起来像这样,但它只到达排序部分:
myProgram input_file other_input_file | awk 'NR<2{print [=16=];next}{print [=16=] | "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
插入我的命令以获得我需要的输出?
所以只保存第一行,输出它然后继续你的脚本。
{
IFS= read -r firstline
printf "%s\n" "$firstline"
sort | uniq -c
} < input_file
您可以将文件的第一行与应用于其他行的命令连接起来。
例如:
cat <(head -n1 filename) <(sort <(tail -n+2 filename) | uniq -c)
这会将 sort | uniq -c
应用于以第二行开头的所有行(通过 tail -n+2
)。使用 cat
.
连接到第一行(通过 head -n1
)
您可以使用这个 gnu awk
:
awk 'NR == 1 { print; next } { ++freq[[=10=]] } 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
类似这样的题还有很多,但是(我看过的)都是对从第一行数据开始的重复字符串进行排序统计。在我的例子中,我需要保留第一行并保持在最上面,同时为以下所有行调用 sort | uniq -c
。我已经到了排序部分,我唯一坚持的部分是 uniq -c
部分。我试过管道,调用 system("uniq -c")
,system(...)
的其他组合,但似乎没有任何效果。我当前的命令行看起来像这样,但它只到达排序部分:
myProgram input_file other_input_file | awk 'NR<2{print [=16=];next}{print [=16=] | "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
插入我的命令以获得我需要的输出?
所以只保存第一行,输出它然后继续你的脚本。
{
IFS= read -r firstline
printf "%s\n" "$firstline"
sort | uniq -c
} < input_file
您可以将文件的第一行与应用于其他行的命令连接起来。
例如:
cat <(head -n1 filename) <(sort <(tail -n+2 filename) | uniq -c)
这会将 sort | uniq -c
应用于以第二行开头的所有行(通过 tail -n+2
)。使用 cat
.
head -n1
)
您可以使用这个 gnu awk
:
awk 'NR == 1 { print; next } { ++freq[[=10=]] } 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