2つのファイルのヘッダーとして存在する共通データに基づいて2つのファイルをマージしたいと思います。
以下は例です。
ファイル1
>Feature scaffold1
1 100 g
101 200 g
201 300 g
>Feature scaffold2
1 100 g
01 500 g
>Feature scaffold3
10 500 g
>Feature scaffold4
10 300 g
ファイル2
>Feature scaffold1
500 500 r
900 1000 r
>Feature scaffold2
200 300 r
>Feature scaffold3
100 200 r
>Feature scaffold4
500 600 r
>Feature scaffold5
1 1000 r
これが私が望む結果です:
>Feature scaffold1
1 100 g
101 200 g
201 300 g
500 500 r
900 1000 r
>Feature scaffold2
1 100 g
01 500 g
200 300 r
>Feature scaffold3
10 500 g
100 200 r
>Feature scaffold4
10 300 g
500 600 r
>Feature scaffold5
1 1000 r
awkとsedを試しましたが、明らかに成功しませんでした。どうすればいいですか?
答え1
Awk
解決策:
awk '/^>/{ k=$1 FS $2 }
NR==FNR{
if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0; next
}
k in a{
print $0 ORS a[k]; delete a[k]; next
}1' file1 file2
/^>/{ k=$1 FS $2 }
- 遭遇したときヘッダーline(ie) - 最初と 2 番目のフィールドで>Feature ...
キーを形成します。k
$1
$2
NR==FNR{ ... }
- 最初の入力ファイル(file1
)を処理します。if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0
- 蓄積するヘッダーではないa
現在のキーを使用して行を配列に配置します。k
next
- 次のレコードに移動
k in a
- レコードに基づく現在のキーが(レコードベース)file2
配列にある場合:a
file1
print $0 ORS a[k]
- 関連レコードの印刷delete a[k]
- 処理されたアイテムの削除
出力:
>Feature scaffold1
1 100 g
101 200 g
201 300 g
500 500 r
900 1000 r
>Feature scaffold2
1 100 g
01 500 g
200 300 r
>Feature scaffold3
10 500 g
100 200 r
>Feature scaffold4
10 300 g
500 600 r
>Feature scaffold5
1 1000 r
答え2
他の方法でもっと簡単にしてください。
grep -v '^scaffold' <(awk -v RS='>Feature ' \
'NF{s[$1]=s[$1]$0} END{for (x in s)print RS""s[x]}' file[12])