使用 sed 仅保留文件的部分内容并重新排序(基于 textWrangler grep 语法)

使用 sed 仅保留文件的部分内容并重新排序(基于 textWrangler grep 语法)

我想编辑一个名为trial.fastq以下格式的文件:

@NAME123.15.1 15 length=151
GTAGCNTACGGGAGGCAGCAGTGGGGAATTTTCC
+NAME123.15.1 15 length=151
AAABB#>>AABDGCEGGGFGGGHHHGGGFHHGHH
@NAME123.14.1 14 length=150
TTCGCNTACGGGAGGCAGCAGTAGGGAATCTTCC
+NAME123.14.1 14 length=150
ABBBB#>>ABBBGGGGGEGGGGHDGFFFHHGHHH

我想将格式更改为:

@Inst:1:FID:LANE:TILE:15:Y 1:Y:0:NAME123
+GTAGCNTACGGGAGGCAGCAGTGGGGAATTTTCC
@Inst:1:FID:LANE:TILE:14:Y 1:Y:0:NAME123
+TTCGCNTACGGGAGGCAGCAGTAGGGAATCTTCC

我尝试过多种格式,sed包括:

sed -i -E 's/@(\w+).(\d+).(\d)\s\d+\slength=\d+\n.*/@Inst:1:FID:LANE:TILE:\2:Y \3:Y:0:\1\n/g' trial.fastq > trial_new.fastq

我通过复制 TextWrangler 查找和替换 grep 搜索找到了它。也:

sed -e 's/\(@\w\).\(\d..+\).\(\d\)\s\d..*\slength\=\d..*\n.*$(\w..*)\(.*\)$\+.*$.*$/@Inst\:1\:FID\:LANE\:TILE\:\2\:Y \3\:Y\:0\:\1\n\4/g' trial.fastq

我很确定我的处理方式是错误的。有人可以帮助我了解我做错了什么以及如何解决这个问题吗?

答案1

我希望我正确理解你想要的输出!

$ sed -nr '/#/d;s/@([^\.]+)[^ ]+ ([0-9]+) .*/@Inst:1:FID:LANE:TILE:\2:Y 1:Y:0:\1/p;s/^[A-Z]/\+&/p' file
@Inst:1:FID:LANE:TILE:15:Y 1:Y:0:NAME123
+GTAGCNTACGGGAGGCAGCAGTGGGGAATTTTCC
@Inst:1:FID:LANE:TILE:14:Y 1:Y:0:NAME123
+TTCGCNTACGGGAGGCAGCAGTAGGGAATCTTCC

解释

  • -n在我们要求之前不要打印
  • -r使用ERE
  • /#/d删除行#
  • ([^\.]+) save some characters that are not.` 稍后
  • [^ ]+ ([0-9]+) .*在空格之间保存一些数字
  • \1反向引用替换中保存的模式
  • ;分隔命令,就像在 shell 中一样
  • s/^[A-Z]/\+&/将以大写字母开头的行替换为前缀+
  • p打印我们处理过的行

-i如果您想就地编辑文件,请使用该标志,在测试输出是否是您想要的之后(使用 重复该命令sed -nri ....

相关内容