各ファイルの最初の2つの列を使用して、fil2、file3、およびfile4の追加の列を適切な行(最初の2つの列が一致する場所)でfile1に追加したいと思います。 File2にはfile1に追加する3つの列がありますが、他のすべてのファイルには追加する列が1つしかありません(最後の列)。
エントリはNW_456 44
file3NW_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