编辑:添加块引用文本
我有一个制表符分隔的文本文件 ( acc.paired.txt
),其中包含照明样本名称 ( head
):
SRR10598163_R1.fastq.gz SRR8916417_R2.fastq.gz
SRR10598049_R1.fastq.gz SRR10598163_R2.fastq.gz SRR8916418_R1.fastq.gz
SRR10598049_R2.fastq.gz SRR10598164_R1.fastq.gz SRR8916418_R2.fastq.gz
SRR10598050_R1.fastq.gz SRR10598164_R2.fastq.gz SRR8916419_R1.fastq.gz
SRR10598050_R2.fastq.gz SRR10598165_R1.fastq.gz SRR8916419_R2.fastq.gz
SRR10598051_R1.fastq.gz SRR10598165_R2.fastq.gz SRR8916420_R1.fastq.gz
SRR10598051_R2.fastq.gz SRR10598166_R1.fastq.gz SRR8916420_R2.fastq.gz
SRR10598052_R1.fastq.gz SRR10598166_R2.fastq.gz SRR8916421_R1.fastq.gz
SRR10598052_R2.fastq.gz SRR10598167_R1.fastq.gz SRR8916421_R2.fastq.gz
SRR10598053_R1.fastq.gz SRR10598167_R2.fastq.gz SRR8916422_R1.fastq.gz
SRR10598053_R2.fastq.gz SRR10598168_R1.fastq.gz SRR8916422_R2.fastq.gz
SRR10598054_R1.fastq.gz SRR10598168_R2.fastq.gz SRR8916423_R1.fastq.gz
我想进行两项更改,1)删除重复的样本名称,2)删除特定样本名称后面的所有字符。我的目标输出是一个制表符分隔的文本文件,其中仅包含SRR###
数字( no _R#.fastq.qz
),没有重复项。目标输出示例:
SRR10598163
SRR8916417
SRR10598049
SRR8916418
SRR10598164
SRR10598050
SRR8916419
SRR10598165
SRR10598051
SRR8916420
SRR10598166
SRR10598052
SRR8916421
SRR10598167
SRR10598053
SRR8916422
SRR10598054
SRR10598168
SRR8916423
我转向sed
删除字符模式:
`sed 's| _R1.fastq.gz||g' acc.paired.txt > out.txt`
但out.txt
沒有變化。
TIA。
答案1
使用grep
和sort
:
grep -oE '\bSR[^_]+' file | sort -u
SRR10598049
SRR10598050
SRR10598051
[...]
正则表达式匹配如下:
节点 | 解释 |
---|---|
\b |
单词字符 (\w) 和非单词字符锚点之间的边界锚点 |
SR |
'SR' |
[^_]+ |
任何字符,除了:_ (1 次或多次(匹配尽可能多的数量)) |
答案2
使用 GNU awk 表示多字符RS
plus\s
以及and 的\S
简写:[[:space:]]
[^[:space:]]
$ awk -v RS='_\\S+\\s*' '!seen[$0]++' file
SRR10598163
SRR8916417
SRR10598049
SRR8916418
SRR10598164
SRR10598050
SRR8916419
SRR10598165
SRR10598051
SRR8916420
SRR10598166
SRR10598052
SRR8916421
SRR10598167
SRR10598053
SRR8916422
SRR10598168
SRR10598054
SRR8916423
答案3
GNUsed命令将是这样的:
sed 's/\s/\n/g;s/_R[0-9].fastq.gz//g' acc.paired.txt | sort |uniq > out.txt
你也可以这样做awk:
awk '{gsub("_R[0-9].fastq.gz","\n", $0)gsub("\n ","\n",$0);gsub("\n$","",$0);print}' acc.paired.txt | sort | uniq > out.txt
第二个和第三个 gsub 函数用于删除空格和最后一个换行符
答案4
你可以
- 将所有空格更改为换行符
tr
- 删除所有
_R1.fastq.gz
与匹配的内容sed
- 删除空行
grep
- 并对输出进行排序,删除重复项
sort
:
% < acc.paired.txt tr ' ' '\n' | sed -e 's/_R.\.fastq\.gz//' | grep . | sort -u
SRR10598049
SRR10598050
SRR10598051
SRR10598052
[...]
除了顺序之外,输出与您的问题中显示的相同。
当然,在正则表达式中,.
匹配任何字符,并且文字点与\.
.grep .
只保留至少包含一个字符的行,因此会丢失tr
从连续空格创建的空行。这也假设只有R1
, 到R9
那里,而不是R11
左右。