複数のファイルがあります。
ファイル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 }'.
両方のファイルが同じ列でソートされていることを確認してください。