按单词出现次数对 bash 中的列进行排序
Sorting a column in bash by amount of occurances of words
所以我输出的文本在一列中有一个 ip 地址,在另一列中有一个 http 状态代码。我不想按出现次数对这一列进行排序,因此
x.x 1
x.x 2
x.y 1
x.z 3
y.x 4
x.x 5
x.x 4
x.x 4
看起来像
y.x 4
x.x 4
x.x 4
x.x 1
x.y 1
x.x 5
x.z 3
x.x 2
这是状态代码的第二列,IP 地址不需要按任何特定顺序排序
因为 4 是最常见的,所以应该在第一个,然后是 1,依此类推。
然而,我所能找到的只是如何使用 uniq
来计算出现次数,从而删除重复项并为每一行添加前缀。
据我所知,常规 sort
命令也不支持此功能。
如有任何帮助,我们将不胜感激
您可以使用这个 awk + sort + cut
组合:
awk 'NR==FNR{++freq[]; next} {print freq[] "\t" [=10=]}' file{,} | sort -k1nr | cut -f 2-
x.x 4
x.x 4
y.x 4
x.x 1
x.y 1
x.x 2
x.x 5
x.z 3
详情:
awk
命令计算第二个字段的频率并将其添加到记录前面
sort
命令对频率字段进行反向数字排序
cut
命令从最终输出中删除第一列
使用 single GNU awk 方法:
awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_desc" }
{ a[]++; b[][++c]= }
END{ for(i in a) for(j in b[i]) print b[i][j],i }' file
PROCINFO["sorted_in"]="@val_num_desc"
- 数组元素的比较,其中 "@val_num_desc"
确保元素值被视为数字,从高到低排序
输出:
y.x 4
x.x 4
x.x 4
x.y 1
x.x 1
x.x 2
x.z 3
x.x 5
所以我输出的文本在一列中有一个 ip 地址,在另一列中有一个 http 状态代码。我不想按出现次数对这一列进行排序,因此
x.x 1
x.x 2
x.y 1
x.z 3
y.x 4
x.x 5
x.x 4
x.x 4
看起来像
y.x 4
x.x 4
x.x 4
x.x 1
x.y 1
x.x 5
x.z 3
x.x 2
这是状态代码的第二列,IP 地址不需要按任何特定顺序排序
因为 4 是最常见的,所以应该在第一个,然后是 1,依此类推。
然而,我所能找到的只是如何使用 uniq
来计算出现次数,从而删除重复项并为每一行添加前缀。
据我所知,常规 sort
命令也不支持此功能。
如有任何帮助,我们将不胜感激
您可以使用这个 awk + sort + cut
组合:
awk 'NR==FNR{++freq[]; next} {print freq[] "\t" [=10=]}' file{,} | sort -k1nr | cut -f 2-
x.x 4
x.x 4
y.x 4
x.x 1
x.y 1
x.x 2
x.x 5
x.z 3
详情:
awk
命令计算第二个字段的频率并将其添加到记录前面sort
命令对频率字段进行反向数字排序cut
命令从最终输出中删除第一列
使用 single GNU awk 方法:
awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_desc" }
{ a[]++; b[][++c]= }
END{ for(i in a) for(j in b[i]) print b[i][j],i }' file
PROCINFO["sorted_in"]="@val_num_desc"
- 数组元素的比较,其中"@val_num_desc"
确保元素值被视为数字,从高到低排序
输出:
y.x 4
x.x 4
x.x 4
x.y 1
x.x 1
x.x 2
x.z 3
x.x 5