我有多个带有某种模式的文件
ABCD 100
ABCD 200
EFGH 500
IJKL 50
EFGH 700
ABCD 800
IJKL 100
我希望匹配每个(ABCD / EFGH / IJKL)的出现次数仅根据第2列中的最高数字排序
ABCD 800
EFGH 700
IJKL 100
我试过cat *txt | sort -k 1 |
??
先谢谢
我的坏,因为没有明确。抱歉浪费你的时间。 下面是详细的例子。该文件有多列。我用awk得到了一个 并尝试了这只猫* txt | awk'{print $ 3,$ 5}'| sort -gr | less。现在我根据数值对字符串进行了排序。现在我如何获得第一场比赛的uniq字符串。
<string> <numeral>
abcde/efgh/ijkl/mnop -450.00
dfgh/adas/gfda/adasd -100.0
abcde/efgh/ijkl/mnop -100.00
lk/oiojl/ojojl -0.078
dfgh/adas/gfda/adasd 50.0
lk/oiojl/ojojl -0.150
O/p needed
abcde/efgh/ijkl/mnop -450.00
dfgh/adas/gfda/adasd -100.0
lk/oiojl/ojojl -0.150
答案 0 :(得分:3)
您可以使用sort
两次:一次对数字进行排序,第二次对字符串进行稳定排序(以便最大数字保留在第一位),删除重复项丢弃数字较小的重复字符串。
sort -k2,2nr file.txt | sort -k1,1 -u --stable
答案 1 :(得分:2)
您可以使用awk关联数组,然后根据第2列进行排序:
awk '{ if ($2>arr[$1]) arr[$1]=$2} END{for (i in arr) print i, arr[i]}' file \
| sort -k2 -rn
答案 2 :(得分:2)
cat *txt | perl -ane 'END{print "$_ $r{$_}\n" for sort keys %r} $_<$F[1] and $_=$F[1] for $r{$F[0]}'
答案 3 :(得分:1)
如果第一列总是4个字符,那么(按照abasu的建议)你可以使用uniq -w4
。
cat *.txt | sort -gr | uniq -w4
按数字顺序排序,('ABCD 800'将在'ABCD 100'之前)并且在查找唯一行时仅考虑前4个字符。
如果第一列不总是4个字符,您可以来回管道rev
,并使用uniq -f1
跳过第一个反转字段。
cat *.txt | sort -gr | rev | uniq -f1 | rev
如果您想定位特定单词并获得最高的相应数字,可以使用
cat *.txt | sort -gr | grep 'ABCD' | head -n 1
答案 4 :(得分:0)
perl -anE'$h{$F[0]}=$F[1]if!exists$h{$F[0]}or$F[1]>$h{$F[0]}}{say"$_ $h{$_}"for keys%h'