使用AWK提取文件中各元素的第N次出现行(以第2次为例)
提取每个元素第N次出现行的AWK解决方案
目标文件内容
AAACGCTGTGTCATTG-1-pere,1,2 AAACGCTTTGTCATTG-1-pere,3,6 AAACGCTATGTCATTG-1-pere,3,4 AAACGCTCTGTCATTG-1-mele,2,1 AAACGCTFTGTCATTG-1-pere,5,8 AAACGCTHTGTCATTG-1-mele,5,3 AAACGCTJTGTCATTG-1-mele,9,8 AAACGCTKTGTCATTG-1-arance,7,7 AAACGCTVTGTCATTG-1-arance,1,1
需求说明
提取文件中每个元素(指pere、mele、arance这类标识)的第2次出现的整行,预期输出如下:
AAACGCTTTGTCATTG-1-pere,3,6 AAACGCTHTGTCATTG-1-mele,5,3 AAACGCTVTGTCATTG-1-arance,1,1
注:$1字段的前缀内容不固定,仅需关注最后一个-后的元素标识。
问题分析
你修改原有AWK命令时犯了两个错误:一是误用赋值运算符=代替比较运算符==,导致语法错误;二是硬编码substr($1,20)的起始位置,无法适配前缀长度变化的场景。
正确实现命令
通用版(适配任意前缀长度)
awk -F, '{ elem = substr($1, rindex($1, "-") + 1) } a[elem]++ == 1' input.txt
硬编码位置版(仅兼容当前文件,不推荐)
如果坚持使用固定起始位置,修正后的命令为:
awk -F, 'a[substr($1,20)]++ == 1' input.txt
命令解释
- 元素提取:
rindex($1, "-")定位$1中最后一个-的位置,substr($1, rindex($1, "-") + 1)提取后续的元素标识,避免硬编码位置的局限性。 - 次数判断:数组
a用于统计每个元素的出现次数,a[elem]++是后置自增——第二次出现时,自增前的值为1,此时a[elem]++ == 1条件成立,输出当前行。 - 扩展到第N次:若要提取第N次出现的行,只需将
== 1改为== N-1,比如提取第3次就写== 2。
内容的提问来源于stack exchange,提问作者pino
相关产品推荐
相关产品推荐

