ディレクトリ内のファイルの解析

ディレクトリ内のファイルの解析

私のディレクトリにはいくつかのファイルがあります:file1.txt file2.txt file3.txt

ディレクトリ内の各ファイルに対して一意の列だけを印刷したいと思います。列 1 は列 3 または 4 と一致します。唯一の列を印刷してf_parsed.txtとして保存したいと思います。

ファイル1.txt:

gene1   description1    gene1   gene88 
gene56  description2    gene67  gene56
gene6   description3    gene95  gene6

file1_parsed.txt:

gene1   description1    gene88  
gene56  description2    gene67  
gene6   description3    gene95  

これは私のコードです。

for f in *.txt ; do while IFS= read -r line; do awk  -F "," '{if ($3 = $1) {print $1, $2, $3} else {print $1, $2, $4}}' > $f_parsed.txt;
    done

次に、解析された各ファイルについて、f_parsed.txtの列3の遺伝子をgrepし、file_B.txtで見つけて一致する行と次の行を返そうとします。一致を含むすべての行はmatch1.txtとして保存されます(次のファイルはmatch2.txtになります)。

file_B.fastaは次のとおりです。

>gene88 | shahid | ahifehhuh
TAGTCTTTCAAAAGA...
>gene6 | shahid | ahifehhuh
TAGTCTTTCAAAAGA...
>gene4 | jeiai | dhdhd
GTCAGTTTTTA...
>gene67 | vdiic | behej
GTCAGTTTTTA...
>gene95 | siis | ahifehhniniuh
TAGTCTTTCAAAAGA...
...
cat f_parsed.txt | while IFS= read -r line; do grep "$3" file_B.fasta  |awk '{x=NR+1}(NR<=x){print}' > match1.txt ; done

私が始めたサンプルファイルの最終出力はmatch1.txtと言うべきです:

>gene88 | shahid | ahifehhuh
TAGTCTTTCAAAAGA...
>gene67 | vdiic | behej
GTCAGTTTTTA...
>gene95 | siis | ahifehhniniuh
TAGTCTTTCAAAAGA...

よろしくお願いします!コードが荒いのは分かりますが初心者です。

答え1

これを行う1つの方法は次のとおりです。まず、fastaファイルを読み、遺伝子名で構成された配列を作成します。このキーに対応する値は、改行で区切られた現在の次のn行です。

出力はmatch*.txtファイルに保存されます。

awk -F '|' '
  # @the beginning of file, get its type
  FNR==1 {  inCsv = !(inFasta = FS == "|") }

  # get gene name n record next line number
  inFasta && /^>/ {
    t=$0; gene=$1
    gsub(/^.|[[:space:]]*$/, "", gene)
    nxtln=NR+1
  }
  # fill up the value for the current gene
  inFasta && NR==nxtln { a[gene] = t ORS $0 }

  # we are in CSV file
  # close previously open filehandle
  # open fresh file handle (match*.txt)
  # write to filehandle based on equality
  # of field1 and field3
  inCsv && NF>3 {
    if (FNR == 1) {
      close(outf)
      outf = "match" ++k ".txt"
    }
    print a[$($1==$3?4:3)] > outf
  }

' file_B.fasta FS=, file*.txt
$ cat match1.txt
>gene88 | shahid | ahifehhuh
TAGTCTTTCAAAAGA...
>gene67 | vdiic | behej
GTCAGTTTTTA...
>gene95 | siis | ahifehhniniuh
TAGTCTTTCAAAAGA..

答え2

awk '{if($1 == $3) {print $1,$2,$NF}else{if($1 == $NF){print $1,$2,$3}}}' filename

出力

gene1 description1 gene88
gene56 description2 gene67
gene6 description3 gene95

関連情報