1行に複数のソートされていないコンテンツを含むファイルがあり、それを新しいファイルに入れたいと思います。以下は、私が持っている部分ファイルの例です。
X1314448: SaMi|SM_g2554.t1 SaMi|SM_g5072.t1 Des|Des_g3808.t1 Dul|Dul_comp50786_c0_seq1-1 Nig|Nig_comp88811_c0_seq2-1 AB|AB0003DMP400018076_AB0003DMT400026495 Phy|Phy_comp35647_c0_seq1-1 SWtf|SW_g27807.t1 Tom|Solyc02g077050.2.1
X1314810: Des|Des_g33587.t1 Nig|Nig_comp84357_c0_seq1-1 AB|AB0003DMP400020961_AB0003DMT400030857 Phy|Phy_comp33112_c0_seq1-1 SaMi|SM_g27352.t1 SWtf|SW_g21774.t1 TAIR|AT4G14930.1 Tom|Solyc06g054250.2.1 Dul|Dul_comp63657_c0_seq2-1
X1327159: AB|AB0003DMP400016823_AB0003DMT400024599 AB|AB0003DMP400017933_AB0003DMT400026257 Dul|Dul_comp58749_c0_seq2-1
X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802 SWtf|SW_g16502.t1
X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Dul|Dul_comp57659_c0_seq2-1 Dul|Dul_comp57659_c0_seq3-1 Dul|Dul_comp57659_c0_seq4-1 Ni g|Nig_comp93106_c3_seq1-1 Nig|Nig_comp93106_c3_seq2-1 AB|AB0003DMP400005485_AB0003DMT400007895 AB|AB0003DMP400021388_PGS C0003DMT400031553 Phy|Phy_comp61931_c0_seq1-1 Phy|Phy_comp61931_c0_seq2-1 Phy|Phy_comp61931_c0_seq3-1 Phy|Phy_comp61931_c0_seq4-1 RICE|LOC_Os08g43334.1 RICE|LOC_Os08g43334.2 RICE|LOC_Os09g35790.1 RICE|LOC_Os09g35790.2 SaMi|SM_g30888.t1 SaMi|SM_g5888.t1 SWtf|SW _g17547.t1 SWtf|SW_g33717.t1 Des|Des_g47565.t1 SaMi|SM_g6027.t1 SWtf|SW_g42019.t1 TAIR|AT5G62020.1 Tom|Solyc03g026020.2.1 TAIR|AT4 G11660.1
私が望むのは、最初の部分「X1314448:」と「Des | Des_g3808.t1」です。別の"Des_xxx"(場合によっては、最後の2行目のように複数があります)がある場合はそれも含めて、出力ファイルに "AB | AB00 ..."を含めたいと思います。並べ替えられていないリスト 3つの異なる部分を同じ行に保ちながら並べ替える方法(相互にリンクさせる方法)がわかりません。また、1つのアイテムから複数の一致を取得する方法もわかりません。
したがって、最初の行の出力は次のようになります。
X1314448: Des|Des_g3808.t1 AB|AB0003DMP400018076_AB0003DMT400026495
2番目の項目の場合:
X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802
最後の項目の場合:
X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Des|Des_g47565.t1 AB|AB0003DMP400005485_AB0003DMT400007895 AB|AB0003DMP400021388_PGSC0003DMT400031553
最大の問題は最後の行だと思います。また、"Dul|..."を含むようにファイルを変更したいと思います。
解決策:
いくつかの研究の最後に、私は次のように結論を下しました。 1 - このスクリプトを別の名前で保存してFastaToTbl
実行可能にします(chmod 744 FastaToTbl
)。
if (substr($1,1,1)==">")
if (NR>1)
printf "\n%s\t", substr($0,2,length($0)-1)
else
printf "%s\t", substr($0,2,length($0)-1)
else
printf "%s", $0
}END{printf "\n"}' "$@"
2 - このスクリプトを含む2番目のファイルを作成します。FastaToTbl
このスクリプトで使用してIDfile1
とシーケンスを抽出しますfile2
。
./mktbl file1[contains FASTA sequences] |
perl -ne 'chomp;@a=split(/\t/); $k{$a[0]}=$a[1]; ## Collect the sequences
## $k{ID}=SEQUENCE
END{open(A,"File02[contains my data that is missing FASTA sequences (ID file)]"); ## Open ID file
while(<A>){ ## and process it line by line
@a=split(/\s+/); ## Gather the IDs in array @a
print shift(@a); ## Print the first element (Jan123:)
print "$_ $k{$_}\n" for @a; ## Print each ID and its seq
}}'
答え1
awk '/^ *$/ {next;}; NR>1 {print bufline;};
{bufline=$1 " ";
for (i=2;i<=NF;i++)
{ if ($i ~ "^Des\\|" || $i ~ "^AB\\|") bufline=bufline sprintf("%s ",$i);
if ($i ~ "^Dul\\|") dul=$i;
};
};
END {print bufline " " dul;}' inputfile
答え2
これはあなたには効果がありません:
sort -k 2
デフォルトでは、ソートはスペースに基づいて列を定義するため、このオプションを変更できます-t
。この場合、2番目のフィールドを基準に並べ替えました。一見すると、あなたのニーズに適しています。
順次ソートしたい場合でも、-k
ソートを使用して追加のオプションを追加できます。マニュアルページから:
-k, --key=KEYDEF sort via a key; KEYDEF gives location and type
KEYDEF は開始位置と停止位置を表す F[.C][OPTS][,F[.C][OPTS]] です。ここで、Fはフィールド番号、Cはフィールドの文字位置です。どちらも原点1です。停止位置はデフォルトで行末に設定されます。
X1327159: AB|AB0003DMP400016823_AB0003DMT400024599 AB|AB0003DMP400017933_AB0003DMT400026257 Dul|Dul_comp58749_c0_seq2-1
X1314810: Des|Des_g33587.t1 Nig|Nig_comp84357_c0_seq1-1 AB|AB0003DMP400020961_AB0003DMT400030857 Phy|Phy_comp33112_c0_seq1-1 SaMi|SM_g27352.t1 SWtf|SW_g21774.t1 TAIR|AT4G14930.1 Tom|Solyc06g054250.2.1 Dul|Dul_comp63657_c0_seq2-1
X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802 SWtf|SW_g16502.t1
X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Dul|Dul_comp57659_c0_seq2-1 Dul|Dul_comp57659_c0_seq3-1 Dul|Dul_comp57659_c0_seq4-1 Ni