4

我有多个带有某种模式的文件

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 得到了需要的,并尝试了这个 cat *txt |awk '{print $3,$5}' | 排序 -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
4

5 回答 5

3

您可以使用sort两次:一次对数字进行排序,第二次对字符串进行稳定排序(以便最大的数字首先保留),删除重复项以丢弃具有较小数字的重复字符串。

sort -k2,2nr file.txt | sort -k1,1 -u --stable
于 2013-05-23T12:12:34.117 回答
2

您可以使用 awk 的关联数组,然后根据第 2 列进行排序:

awk '{ if ($2>arr[$1]) arr[$1]=$2} END{for (i in arr) print i, arr[i]}' file \
| sort -k2 -rn
于 2013-05-23T07:08:37.090 回答
2
cat *txt | perl -ane 'END{print "$_ $r{$_}\n" for sort keys %r} $_<$F[1] and $_=$F[1] for $r{$F[0]}'
于 2013-05-23T07:10:48.130 回答
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

于 2013-05-23T07:06:57.007 回答
0
perl -anE'$h{$F[0]}=$F[1]if!exists$h{$F[0]}or$F[1]>$h{$F[0]}}{say"$_ $h{$_}"for keys%h'
于 2013-08-03T20:02:34.933 回答