使用 sed 从文本文件中删除特定字符串,不更改输出文件?

使用 sed 从文本文件中删除特定字符串,不更改输出文件?

编辑:添加块引用文本

我有一个制表符分隔的文本文件 ( 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

使用grepsort

grep -oE '\bSR[^_]+' file | sort -u

SRR10598049
SRR10598050
SRR10598051
[...]

正则表达式匹配如下:

节点 解释
\b 单词字符 (\w) 和非单词字符锚点之间的边界锚点
SR 'SR'
[^_]+ 任何字符,除了:_(1 次或多次(匹配尽可能多的数量))

答案2

使用 GNU awk 表示多字符RSplus\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左右。

相关内容