私のディレクトリにはいくつかのファイルがあります: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