需要在文件中仅匹配模式发生一次

时间:2013-05-23 07:00:34

标签: perl bash shell

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

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

5 个答案:

答案 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'