最初の2つの列を一致させ、適切な行に列を追加します。

最初の2つの列を一致させ、適切な行に列を追加します。

各ファイルの最初の2つの列を使用して、fil2、file3、およびfile4の追加の列を適切な行(最初の2つの列が一致する場所)でfile1に追加したいと思います。 File2にはfile1に追加する3つの列がありますが、他のすべてのファイルには追加する列が1つしかありません(最後の列)。

エントリはNW_456 44file3NW_987 75にコメントされていないため、失われます。その特定の列の出力ファイルを空白にしたいです(実際には「空」とは表示されません)。

例:

ファイル1

NW_1234 23
NW_1234 29
NW_1234 778
NW_456 44
NW_987 75
NW_987 98
NW_5000 105
NW_5500 37
NW_5500 900

ファイル2

NW_1234 23  C   0:0:32:0:0:0    42:0:0:0:0:0
NW_1234 29  C   0:0:28:0:0:0    0:28:0:0:0:0
NW_1234 778 C   0:54:0:0:0:0    0:0:53:0:0:0
NW_456  44  G   0:0:0:45:0:0    59:0:0:0:0:0
NW_987  75  G   0:0:0:60:0:0    55:0:0:0:0:0
NW_987  98  C   0:0:63:0:0:0    0:42:0:0:0:0
NW_5000 105 G   0:0:71:0:0:0    0:50:0:0:0:0
NW_5500 37  G   0:0:0:54:0:0    55:0:0:0:0:0
NW_5500 900 A   43:0:0:0:0:0    0:0:0:37:0:0

ファイル3

NW_1234 23  DOCK
NW_1234 29  DOCK
NW_1234 778 DOCK
NW_987  98  TFEC
NW_5000 105 MIN
NW_5500 37  LIPG
NW_5500 900 MYC

ファイル4

NW_1234 23  intron_region
NW_1234 29  intron_region
NW_1234 778 intron_region
NW_456  44  intergenic
NW_987  75  intergenic
NW_987  98  intron_region
NW_5000 105 intron_region
NW_5500 37  intron_region
NW_5500 900 intron_region

結果ファイル

NW_1234 23  C   0:0:32:0:0:0    42:0:0:0:0:0 DOCK intron_region
NW_1234 29  C   0:0:28:0:0:0    0:28:0:0:0:0 DOCK intron_region
NW_1234 778 C   0:54:0:0:0:0    0:0:53:0:0:0 DOCK intron_region
NW_456  44  G   0:0:0:45:0:0    59:0:0:0:0:0 (empty) intergenic
NW_987  75  G   0:0:0:60:0:0    55:0:0:0:0:0 (empty) intergenic
NW_987  98  C   0:0:63:0:0:0    0:42:0:0:0:0 TFEC intron_region
NW_5000 105 G   0:0:71:0:0:0    0:50:0:0:0:0 MIN  intron_region
NW_5500 37  G   0:0:0:54:0:0    55:0:0:0:0:0 LIPG intron_region
NW_5500 900 A   43:0:0:0:0:0    0:0:0:37:0:0 MYC  intron_region

この質問に似ています。2番目の列の一致に基づいて列を追加する

助けてくれてありがとう!

答え1

タブを出力フィールド区切り文字として使用すると、すべてのUNIXシステムのすべてのシェル内のすべてのawkで機能します。

$ cat tst.awk
BEGIN { OFS="\t";  }
FNR==1 { fileNr++ }
{
    key = $1 OFS $2
    if (NR == FNR) {
        keys[++numKeys] = key
    }
    else {
        sub(/([^[:space:]]+[[:space:]]+){2}/,"")
        $1 = $1
        vals[key,fileNr] = $0
    }
}
END {
    for (keyNr=1; keyNr<=numKeys; keyNr++) {
        key = keys[keyNr]
        printf "%s", key
        for (fileNr=2; fileNr<ARGC; fileNr++) {
            printf "%s%s", OFS, vals[key,fileNr]
        }
        print ""
    }
}

$ awk -f tst.awk file1 file2 file3 file4
NW_1234 23      C       0:0:32:0:0:0    42:0:0:0:0:0    DOCK    intron_region
NW_1234 29      C       0:0:28:0:0:0    0:28:0:0:0:0    DOCK    intron_region
NW_1234 778     C       0:54:0:0:0:0    0:0:53:0:0:0    DOCK    intron_region
NW_456  44      G       0:0:0:45:0:0    59:0:0:0:0:0            intergenic
NW_987  75      G       0:0:0:60:0:0    55:0:0:0:0:0            intergenic
NW_987  98      C       0:0:63:0:0:0    0:42:0:0:0:0    TFEC    intron_region
NW_5000 105     G       0:0:71:0:0:0    0:50:0:0:0:0    MIN     intron_region
NW_5500 37      G       0:0:0:54:0:0    55:0:0:0:0:0    LIPG    intron_region
NW_5500 900     A       43:0:0:0:0:0    0:0:0:37:0:0    MYC     intron_region

スペースをスペースに変更するには(追加ツールの解析にはあまり役に立ちません)、次にパイプするだけですcolumn

$ awk -f tst.awk file1 file2 file3 file4 | column -s$'\t' -t
NW_1234  23   C  0:0:32:0:0:0  42:0:0:0:0:0  DOCK  intron_region
NW_1234  29   C  0:0:28:0:0:0  0:28:0:0:0:0  DOCK  intron_region
NW_1234  778  C  0:54:0:0:0:0  0:0:53:0:0:0  DOCK  intron_region
NW_456   44   G  0:0:0:45:0:0  59:0:0:0:0:0        intergenic
NW_987   75   G  0:0:0:60:0:0  55:0:0:0:0:0        intergenic
NW_987   98   C  0:0:63:0:0:0  0:42:0:0:0:0  TFEC  intron_region
NW_5000  105  G  0:0:71:0:0:0  0:50:0:0:0:0  MIN   intron_region
NW_5500  37   G  0:0:0:54:0:0  55:0:0:0:0:0  LIPG  intron_region
NW_5500  900  A  43:0:0:0:0:0  0:0:0:37:0:0  MYC   intron_region

関連情報