使用sed/awk/cut修改文本中以>开头的行,提取|分隔的指定字段
解决方案
方案1:sed 单命令实现(优先推荐,兼容性好、效率极高)
GNU sed(Linux系统默认自带)直接执行以下命令即可原地修改文件:
sed -i '/^>/ s/^>[^|]*|\([^|]*\)|.*/>\1/' 目标文件.txt
如果你需要自动备份原文件,避免操作失误,可以加备份后缀:
# 执行后会自动生成 目标文件.txt.bak 备份 sed -i.bak '/^>/ s/^>[^|]*|\([^|]*\)|.*/>\1/' 目标文件.txt
如果是macOS系统自带的sed,命令需要调整为:
sed -i '' '/^>/ s/^>[^|]*|\([^|]*\)|.*/>\1/' 目标文件.txt
命令逻辑说明:
/^>/仅匹配以>开头的待修改行,其他行原样保留- 替换规则:匹配开头
>+第一个|之前的所有内容 + 第一个|+ 捕获两个|之间的内容 + 后续所有内容,最终替换为>加捕获到的需要保留的字段 - 单遍扫描文件,无额外进程开销,百万行大文件处理效率极高
方案2:awk 实现
如果你更习惯用awk,gawk 4.1及以上版本支持原地编辑,执行以下命令即可:
awk -i inplace 'BEGIN{FS="|"} /^>/{print ">" $2; next} {print}' 目标文件.txt
命令逻辑说明:
- 以
|作为字段分隔符 - 匹配到
>开头的行时,直接输出>加第二个字段,跳过后续逻辑 - 其他行原样输出
- 同样为单遍扫描,处理大文件效率极高
补充说明
你之前单独用cut的方案已经很接近需求,只是cut无法针对特定行前缀做特殊处理,配合sed/awk的行匹配能力就可以完美满足要求,不需要多命令管道组合,避免额外IO开销。
内容的提问来源于stack exchange,提问作者roblanf
相关产品推荐
相关产品推荐

