出力ファイルを変更せずに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

私がしたい変更は2つあります。 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変化はありません。

ティア。

答え1

使用grepsort:

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

SRR10598049
SRR10598050
SRR10598051
[...]

正規表現の一致は次のとおりです。

説明する
\b 単語文字(\w)と単語以外の文字アンカーの間の境界アンカー
SR 「SR」
[^_]+ 以下を除くすべての文字:_(1回以上(最大の一致)

答え2

GNU awk を使用して、との複数文字のプラスRSと略語を表します。\s\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

牛に似た一種の栄養sedコマンドは次のとおりです。

sed 's/\s/\n/g;s/_R[0-9].fastq.gz//g' acc.paired.txt | sort |uniq > out.txt

また、これを行うことができますアッ:

awk '{gsub("_R[0-9].fastq.gz","\n", $0)gsub("\n ","\n",$0);gsub("\n$","",$0);print}' acc.paired.txt | sort | uniq > out.txt

2番目と3番目の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 .は少なくとも1つの文字を含む行のみを保持するため、連続しtrた空白の空白行は失われます。これはまた、周りではなく、そこにR1到達するためにのみ、仮定します。R9R11

関連情報