コマンドを貼り付けて出力ファイルをフォーマットする

コマンドを貼り付けて出力ファイルをフォーマットする

複数のファイルがあります。

ファイルA

A: 18.49 RPKM    
C: 14.49 RPKM    
B: 18.89 RPKM

文書B

A: 21.29 RPKM    
C: 38.71 RPKM    
B: 36.13 RPKM

これら2つのファイルを貼り付けて、最初の列だけを一度印刷し、各ファイルの2番目の列を印刷したいと思います。

希望の出力(タブ区切り)

A:  18.49   21.29   
C:  14.49   38.71   
B:  18.89   36.13

貼り付けコマンドを使用しました。

paste FileA FileB | awk '{ { print $1} {ORS="\t"} for (i=2; i<=NF; i+=3) { print $i } {print "\n"} }'

私はこの出力を得る

ㅏ:

18.49 21.29

中:14.49 38.71

B:18.89 36.13

この問題を解決する方法を提案できますか?ありがとうございます! !

答え1

すべてのUNIXシステムのすべてのシェルにあるawkの場合、入力ファイルの数に関係なく必要なものは次のとおりです。

$ paste FileA FileB | awk '{o=$1; for (i=2; i<NF; i+=3) o=o"\t"$i; print o}'
A:      18.49   21.29
C:      14.49   38.71
B:      18.89   36.13

答え2

ORS出力は記録区切り文字(通常は改行文字)です。これが{print $1}最初の行の後に改行文字がある理由です。通常、OFSフィールドを区切る出力フィールド区切り文字を設定する必要があります。

各フィールドを選択的に印刷する代わりに(列5(2番目のファイルの2番目の列)が列3になり、列8(3番目のファイルの2番目の列)に必要なフィールドを開始列2に移動できます)列4になり、NF残りの不要な列を削除できます。

BEGIN { OFS = "\t" }
{
  nfiles = NF / 3;  # get number of files
  for (i = 2; i <= nfiles; i++)  # second column is already OK, start from 3
    $(i+1) = $(3*i - 1);   # Assign 2nd column of file no. i to column no. i + 1
  NF = nfiles + 1 # set NF to delete remaining columns
}
1  # print lines

FileCたとえば、BFileDとAのコピーがあります。

~ paste File* | awk -v OFS='\t' '{nfiles = NF / 3; for (i = 2; i <= nfiles; i++) $(i+1) = $(3*i - 1); NF = nfiles + 1} 1'
A:  18.49   21.29   21.29   18.49
C:  14.49   38.71   38.71   14.49
B:  18.89   36.13   36.13   18.89

答え3

join fileA fileB |awk '{ print $1"\t"$2"\t"$3 }'. 

両方のファイルが同じ列でソートされていることを確認してください。

関連情報