我有:
constant1apple_____constant2asdfkjo___constant3
constant1apple_____constant2fdlkjef___constant3
constant1watermelonconstant2sdlfkeio__constant3
constant1banana____constant2asdfoie___constant3
constant1apple_____constant2soeivmn___constant3
constant1orange____constant2vjflkdslj_constant3
constant1watermelonconstant2xcvlvdiosnconstant3
constant1orange____constant2wieonvow__constant3
constant1apple_____constant2woemnivoiwconstant3
我只想保留第一次出现水果名称的行
输出应该是这样的:
constant1apple_____constant2asdfkjo___constant3
constant1watermelonconstant2sdlfkeio__constant3
constant1banana____constant2asdfoie___constant3
constant1orange____constant2vjflkdslj_constant3
重要笔记:
水果的名字可以是我不知道的任何名字,但它们的长度都是一样的
水果名称后面的随机字符串也可以是任何东西,但也有特定的长度
不知道该怎么做
使用 awk(或 perl,或大多数其他具有关联数组的语言)这样做会更容易一些:
(awk 脚本的结构类似于
match1 {code1} match2 {code2} ...
第一个变体仅指定匹配条件而不是代码,使用隐式默认值{print;}
;第二个变体做相反的事情但实现相同的事情。任何更容易使用的。)这
seen
是一个关联数组(一个 dict / hashmap),它计算到目前为止第二个字段被看到的次数。对于每一行,seen[x]++
递增保持的值seen[x]
并同时返回先前的值。如果之前的值为 0,则表示第一次看到水果。在这个版本中,
substr(input, start, count)
用于从$0(代表整行)中提取10个字符,从第10个字符开始。(在之前的版本中,数组键$2
用于第二个空格分隔的列。)awk 效果很好,但取决于您计划进行多少过滤(如果它不仅仅是提取唯一的第二列),最好从更通用的语言开始:
或者,如果名称可以安全地重新排序,您可以使用
uniq
删除重复项:如果您只需要水果名称本身,忽略其余部分,您可以通过先提取列并使用
uniq
剩下的列来实现: