2016-04-01 2 views
0

私は大きな助けとサポートに感謝したいと思います。まあ、私は、次のファイルがあります:Linuxでファイルを整理する

name id alello chr pos snp  
s1  215  a 1 11 a215  
s1  216  a 1 11 a216  
s1  217  a 1 11 a217  
s1  218  a 1 11 a218  
s2  215  b 2 22 b215  
s2  216  b 2 22 b216  
s2  217  b 2 22 b217  
s2  218  b 2 22 b218 

を、私は、ファイルがこの方法であることが必要です。

snp allelo chr pos 215  216  217 218  
s1  a 1 11 a215 a216 a217 a218  
s2  b 2 22 b215 b216 b217 b218 

してください、誰かが私を助けることができますか?大変ありがとうございます

+0

私の質問を編集してくれてありがとう、Jas。 –

答えて

1

awkレスキュー!

$ awk 'NR==1{h=$1 OFS $3 OFS $4 OFS $5; next} 
      {a[$1]=(($1 in a)?(a[$1] OFS $NF):($3 OFS $4 OFS $5 OFS $6)); 
      if(!($2 in b)) {h=h OFS $2; b[$2]}} 
     END{print h; for(k in a) print k,a[k]}' file | column -t 

name alello chr pos 215 216 217 218 
s1 a  1 11 a215 a216 a217 a218 
s2 b  2 22 b215 b216 b217 b218 
+0

こんにちは、ありがとう。しかし動作しないと、エラーメッセージが表示されます。 2行目:$:コマンドが見つかりません –

+0

申し訳ありませんが、それは完璧な作業です... –

+0

ありがとうございます。 –

0
$ cat tst.awk 
NR == 1  { hdr = $1 OFS $3 OFS $4 OFS $5; next } 
!seen[$2]++ { hdr = hdr OFS $2 } 

$1 != prev { 
    if (++numRows > 1) { 
     if (numRows == 2) { 
      print hdr 
     } 
     print row 
    } 
    row = $1 OFS $3 OFS $4 OFS $5 
} 
{ row = row OFS $6; prev = $1 } 
END { print row } 

$ awk -f tst.awk file | column -t 
name alello chr pos 215 216 217 218 
s1 a  1 11 a215 a216 a217 a218 
s2 b  2 22 b215 b216 b217 b218 

この意志の出力は一度に彼らは、入力中に表示される順序で行と、それだけをメモリに格納する1行が、それはあなたの入力ファイルがどのように大規模なだけでなく関係なく動作しますので注意してください。

+0

ありがとう、でも走れませんでした。多くのエラーが表示されます: ./tr.sh:3行目:NR:コマンドが見つかりません ./tr.sh:3行目:次:コマンドが見つかりません ./tr.sh:4行目:!seen [] ++ :コマンドが見つかりませんでした。 ./tr.sh:行6:!=:コマンドが見つかりません。 ./tr.sh:予期しないトークンの近くに構文エラーがあります。 '}' ./tr.sh:行8: '} ' あなたが助けることができれば、私は非常に感謝します。 彼らは愚かな間違いのように見えるかもしれませんが、私は素人であり修正できません。 –

+0

あなたのスクリプトを見ることなく、それをデバッグするのは難しいですが、** GUESS **でawkスクリプトを 'tr.sh'という名前のファイルに入れ、' ./tr.sh file'として実行しようとしました。 'awk -f tr.sh file'の代わりに。 Awkはシェルではなく、awkは独自の構文とセマンティクスを持つシェルから呼び出すツールです。 –

関連する問題