从制表符分隔的文件中删除带有模式的字符

Posted

技术标签:

【中文标题】从制表符分隔的文件中删除带有模式的字符【英文标题】:Remove characters with pattern from a tab-delimited file 【发布时间】:2021-06-20 22:53:57 【问题描述】:

我有一些带有模式的保存文件,例如

NODE_1_length_59711_cov_84.026979_g0_i0_1 12.8
NODE_1_length_59711_cov_84.026979_g0_i0_2 18.9
NODE_2_length_59711_cov_84.026979_g0_i0_1 14.3
NODE_2_length_59711_cov_84.026979_g0_i0_2 16.1
NODE_165433_length_59711_cov_84.026979_g0_i0_1 29

我想删除从“1”开始到最后一个“_”的所有字符。这样我就可以从多个文件中获得这样的输出-

1_1 12.8
1_2 18.9
2_1 14.3
2_2 16.1
165433_1 29

【问题讨论】:

欢迎来到 SO,请在您的问题中以代码的形式添加您的努力,这在 SO 上受到强烈鼓励,谢谢。 echo 'NODE_165433_length_59711_cov_84.026979_g0_i0_1' | sed -E 's/^NODE_([0-9]+)_.*_([0-9]+)/\1_\2/' 【参考方案1】:

使用 GNU awk:

awk -F "\t" ' fld1=gensub(/(^NODE_)([[:digit:]]+)(.*)([[:digit:]]+$)/,"\\2_\\4","g",$1);OFS=IFS;print fld1"\t"$2' file

解释:

awk -F "\t" '                                                       # Set the field separator to tab
               fld1=gensub(/(^NODE_)([[:digit:]]+)(.*)([[:digit:]]+$)/,"\\2_\\4","g",$1);                                      # Split the first field into 4 sections represented in parenthesis and then substitute the line for the the second section, a "_" and then the fourth section. Read the result into a variable fld1
               print fld1"\t"$2                                      # Print fld1, followed by a tab and then the second field.
             ' file

【讨论】:

【参考方案2】:

see demo

echo 'NODE_165433_length_59711_cov_84.026979_g0_i0_1' | sed -E 's/^NODE_([0-9]+)_.*_([0-9]+)/\1_\2/'

输出:

165433_1

【讨论】:

以上是关于从制表符分隔的文件中删除带有模式的字符的主要内容,如果未能解决你的问题,请参考以下文章

使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表

在c ++中删除一行中的所有字符直到模式匹配的最快方法是什么?

将包含超过255个字段的制表符分隔文本文件导入两个访问表的工作代码

sed 替换字符制表符分隔的 csv

查询带有标题的制表符分隔的文本文件时出现 VBA 错误 - “没有为一个或多个必需参数提供值”

制表符分隔文件的 OleDb 连接字符串