![使用 sed 仅保留文件的部分内容并重新排序(基于 textWrangler grep 语法)](https://linux22.com/image/107079/%E4%BD%BF%E7%94%A8%20sed%20%E4%BB%85%E4%BF%9D%E7%95%99%E6%96%87%E4%BB%B6%E7%9A%84%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9%E5%B9%B6%E9%87%8D%E6%96%B0%E6%8E%92%E5%BA%8F%EF%BC%88%E5%9F%BA%E4%BA%8E%20textWrangler%20grep%20%E8%AF%AD%E6%B3%95%EF%BC%89.png)
我想编辑一个名为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 ....
)