检查重复时使用第 1[N] 个字符

检查重复时使用第 1[N] 个字符

我的文件中有一组数据:

AAAPOL.0001  
AAAPOL.0002  
AAAPRO.0001  
AAAPRO.0002  
AAAPRO.0003  
AAAPRO.0004  
AAAXEL.0002  
AAAJOK.1111  
AAAJOK.2222

我只需要使用前 6 个字符的模式第一次出现,因此我需要知道如何检查仅与前 6 个字符匹配的重复/唯一性。

该命令应从上面的数据返回:

AAAPOL.0001   
AAAPRO.0001   
AAAXEL.0002   
AAAJOK.1111 

我无权访问该uniq -w选项。

答案1

如果您不介意更改行的顺序,则可以将sort -u排序键设置为前 6 个字符:

sort -u -k 1,1.6

或者到 之前的部分.

sort -t . -u -k 1,1

答案2

使用 awk

在您的示例中,前六个字符后跟一个句点。如果这总是正确的,那么:

$ awk -F. '!c[$1]++' File
AAAPOL.0001
AAAPRO.0001
AAAXEL.0002
AAAJOK.1111

这是通过用作.字段分隔符并跟踪第一个字段已经出现的次数来实现的。

如果情况并非如此,那么:

$ awk '!c[substr($0, 1, 6)]++' File
AAAPOL.0001
AAAPRO.0001
AAAXEL.0002
AAAJOK.1111

substr($0, 1, 6)是该行的前六个字符。关联数组c记录我们看到前六个字符的次数。因此,如果c[substr($0, 1, 6)]不为零,则我们已经看到了这些字符,并且不应打印该行。在 awk 中,非零表示 true。因此,我们用以下方法反转测试!:这意味着!c[substr($0, 1, 6)]如果这六个字符具有不是以前见过。在我们读取下一行之前,尾随++会更新计数。c

使用uniq

对于那些与OP不同,可以访问uniq带有该-w选项的版本的人来说,供参考,然后:

$ uniq -w6 File
AAAPOL.0001
AAAPRO.0001
AAAXEL.0002
AAAJOK.1111

相关内容