2017-08-09 13 views
0

私はawkと仕事があります。私はいくつかの遺伝子の配列解析を行っています。 私は順序で複数のファイルを持っています。私は新しいファイルに各ファイルの最初のシーケンスを抽出し、最後のシーケンスまでのようにしたいと思います。私はawkで最初の行または特定の行をどうやって行うのかしか知りません。ここでいくつかのファイルの2行を特定の順序で新しいファイルに印刷するにはどうすればよいですか?

awk 'FNR == 2 {print; nextfile}' *.txt > newfile 

私が持っているこの

ファイル1

Saureus081.1 
ATCGGCCCTTAA 
Saureus081.2 
ATGCCTTAAGCTATA 
Saureus081.3 
ATCCTAAAGGTAAGG 

ファイル2

SaureusRF1.1 
ATCGGCCCTTAC 
SauruesRF1.2 
ATGCCTTAAGCTAGG 
SaureusRF1.3 
ATCCTAAAGGTAAGC 

ファイル3

SaureusN305.1 
ATCGGCCCTTACT 
SauruesN305.2 
ATGCCTTAAGCTAGA 
SaureusN305.3 
ATCCTAAAGGTAATG 
などの入力

同様のファイル12があります ファイル4 です。 。 。 .FILE 12

必要な出力 NEWFILE

Saureus081.1 
ATCGGCCCTTAA 
SaureusRF1.1 
ATCGGCCCTTAC 
SaureusN305.1 
ATCGGCCCTTACT 
Saureus081.2 
ATGCCTTAAGCTATA 
SaureusRF1.2 
ATGCCTTAAGCTAGG 
SauruesN305.2 
ATGCCTTAAGCTAGA 
Saureus081.3 
ATCCTAAAGGTAAGG 
SaureusRF1.3 
ATCCTAAAGGTAAGC 
SaureusN305.3 
ATCCTAAAGGTAATG 

私は、このタスクがawkで簡単に行えますが、複数行のため

+0

前もって間違った入力データを投稿して申し訳ありません。 –

答えて

0

、答えはいくつかの変更で行われなければなりません。

$ awk -F'.' 'NR%2{k=$2;v=$0;getline;a[k]=a[k]?a[k] RS v RS $0:v RS $0} END{for(i in a)print a[i]}' file1 file2 file3 
Saureus081.1 
ATCGGCCCTTAA 
SaureusRF1.1 
ATCGGCCCTTAC 
SaureusN305.1 
ATCGGCCCTTACT 
Saureus081.2 
ATGCCTTAAGCTATA 
SauruesRF1.2 
ATGCCTTAAGCTAGG 
SauruesN305.2 
ATGCCTTAAGCTAGA 
Saureus081.3 
ATCCTAAAGGTAAGG 
SaureusRF1.3 
ATCCTAAAGGTAAGC 
SaureusN305.3 
ATCCTAAAGGTAATG 

簡単な説明、

  • セット'.'毎に奇数のレコードの区切り文字
  • として、次のようにレコードの$0を設定するアレイa
  • 呼び出しgetlineのキーとしてk=$2を区別値はキーに対応しますk
  • ar最後のステップ
+0

私の巨大なデータを使っているときに申し訳ありません正しい出力 –

+0

それはあなたのために働いたあなたの巨大なデータのために同じ形式の入力を採用すれば、それは問題なしにすべきです。 – CWLiu

+0

ここに私のデータで奇妙な出力を与えています。 –

0

ペースト +を行うにはどのように任意のアイデアを得ていないことがことができますねawk解決策:

paste File1 File2 | awk '{ p=$2;$2="" }NR%2{ k=p; print }!(NR%2){ v=p; print $1 RS k RS v }' 
  • paste File1 File2 - ファイル

  • p=$2;$2=""の行に対応するマージ - File2


からそれぞれのキー/値である2番目のフィールドの値をキャプチャ出力:

複数のファイルのための

追加アプローチ:変更された質問に基づいて

paste Files[0-9]* | awk 'NR%2{ k=$1; n=NF; print k } 
     !(NR%2){ print $1; for(i=2;i<=n;i++) print k RS $i }' 
+0

ありがとうございます.2つのファイルでうまくいきましたが、残念ながら12個のファイルがあります。申し訳ありませんが、以前は問題に言及していませんでしたが、今編集しました –

+0

@ThulasiR、私の更新を確認してください – RomanPerekhrest

+0

これは本当にうまくいっていますが、問題は自分の入力にあります。実際、私のデータにはseq1、seq2は含まれていませんが、問題のように書いた簡単な理解のために各シーケンスに固有のコードが含まれています。あなたの助けをありがとう –

0

ための光線あなたのデータは非常に大きい場合、私は一時ファイルを作成することをお勧め:

awk 'FNR%2==1 { filename = $1 } 
       { print $0 >> filename }' file1 ... filen 

その後、あなたがそれらを一緒にcatことができます。

cat Seq1 ... Seqn > result 

をこれは持っていますすべてのファイルがすべてのファイルに含まれていない場合でも機能するという利点があります。

関連する問題