1

次の形式のテキスト ファイルがあります。

variableStep chrom=chr1 span=10
10161   1
10171   1
10181   2
10191   2
10201   2
10211   2
10221   2
10231   2
10241   2
10251   1
variableStep chrom=chr10 span=10
70711   1
70721   2
70731   2
70741   2
70751   2
70761   2
70771   2
70781   2
70791   1
71161   1
71171   1
71181   1
variableStep chrom=chr11 span=10
104731  1
104741  1
104751  1
104761  1
104771  1
104781  1
104791  1
104801  1
128711  1
128721  1
128731  1

これを「chr1.txt」、「chr10.txt」、「chr11.txt」などの名前の複数のファイルに分割する方法が必要です。これを行うにはどうすればよいですか?

私は次の方法について:

cat file.txt | \
while IFS=$'\t' read  -r -a rowArray; do
    echo -e "${rowArray[0]}\t${rowArray[1]}\t${rowArray[2]}"
done > $file.mod.txt

これは、1 行ずつ読み取り、1 行ずつ保存します。ただし、行にまたがるもう少し精巧なものが必要です。「chr1.txt」には行 10161 1 から行 10251 1 までのすべてが含まれ、「chr10.txt」には行 70711 1 から行 71181 1 までのすべてが含まれます。同様に各行から chr# を付けてファイル名として保存します。

助けてくれて本当にありがとう。

4

4 に答える 4

4
awk -F'[ =]' '
  $1 == "variableStep" {file = $3 ".txt"; next}
  file != "" {print > file}' < input.txt
于 2013-06-12T21:56:11.533 に答える
1

テキスト ファイルは既に (多かれ少なかれ) 列に編成されているため、この問題のドメインには awk が適しています。これが私が使用するものです:

awk 'NF == 3 && index($2, "=") { filename = substr($2, index($2, "=") + 1) }
     NF == 2 && filename { print $0 > (filename ".txt") }' < input.txt

説明:

variableStepで始まる行を「3 列」、その他の行を「2 列」と考えてください。上記のスクリプトは、「テキスト ファイルを 1 行ずつ解析します。行に 3 つの列があり、2 番目の列に '=' 文字が含まれている場合、'=' の後に出現する 2 番目の列のすべての文字を割り当てます。文字' をfilename変数filename.

ノート:

  • NFは、「フィールド数」を表す Awk の組み込み変数です。「フィールド」(この場合) は、データの列と考えることができます。
  • $0$2は、それぞれ行全体とデータの 2 列目を表す組み込み変数です。( $1は最初の列を表し、$3は 3 番目の列を表すなど...)
  • substrindexは、 ここで説明されている組み込み関数です: http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions脚本; 同じファイルへの後続の書き込みは追加されます。
  • 文字列の連結は、式を並べて記述するだけで実行されます。括弧は、ファイルが書き込まれる前に連結が行われることを保証します。

詳細については、http ://www.gnu.org/software/gawk/manual/gawk.html#Two-Rules を参照してください。

于 2013-06-12T23:42:26.177 に答える
-1

私はsedを使用してフィルタリングしました....

コード部分:

Kaizen ~/so_test $ cat zsplit.sh

cntr=1;
prev=1;
for curr in `cat ztmpfile2.txt | nl | grep variableStep | tr -s " " | cut -d" " -f2 | sed -n 's/variableStep//p'`
do
sed -n "$prev,$(( ${curr} - 1))p" ztmpfile2.txt > zchap$cntr.txt ;
#echo "displaying : : zchap$cntr.txt " ;
#cat zchap$cntr.txt ;
prev=$curr; cntr=$(( $cntr + 1 ));
done

 sed -n "$prev,$ p" ztmpfile2.txt > zchap$cntr.txt ;
 #echo "displaying : : zchap$cntr.txt " ;
 #cat zchap$cntr.txt ;

出力:

Kaizen ~/so_test $  ./zsplit.sh
+ ./zsplit.sh
zchap1.txt :: 1 :: 1
displaying : : zchap1.txt
variableStep chrom=chr1 span=10
zchap2.txt :: 1 :: 12
displaying : : zchap2.txt
variableStep chrom=chr1 span=10
10161   1
10171   1
10181   2
10191   2
10201   2
10211   2
10221   2
10231   2
10241   2
10251   1
zchap3.txt :: 12 :: 25
displaying : : zchap3.txt
 variableStep chrom=chr10 span=10
70711   1
70721   2
70731   2
70741   2
70751   2
70761   2
70771   2
70781   2
70791   1
71161   1
71171   1
71181   1
displaying : : zchap4.txt
variableStep chrom=chr11 span=10
104731  1
104741  1
104751  1
104761  1
104771  1
104781  1
104791  1
104801  1
128711  1
128721  1
128731  1

結果の zchap* ファイルから、必要に応じて次の行を削除できます: variableStep chrom=chr11 span=10 by using sed --sed -i '/variableStep/d' zchap*

これは役に立ちますか?

于 2013-06-12T17:09:12.300 に答える