chr position value 形式のファイルが複数あります。
「chr」、「position」、「samp1」、「samp2」、「samp3」、「samp4」の形式に変換したいと思います。
たとえば、
サンプル1:
chr position value
1 3774318 1
1 3774319 1
1 3775200 2
1 3775201 7
1 3775202 70
1 3775203 7
1 3775204 270
1 3775205 3
1 3775206 5
サンプル2:
chr position value
1 3775200 1
1 3775201 1
1 3775202 10
1 3775203 1
1 3775204 12
1 3775205 1
1 3775206 13
1 3775207 1
1 3775208 1
1 3775209 18
(など...)
目的の出力ファイル:/出力ファイルに任意の値を入れました。
chr, position, value-samp1, value-samp2, value-samp3, value-samp4
1 50204 2 17 5 2
1 50205 2 17 5 2
1 50206 2 18 5 2
1 50207 2 19 5 3
1 50208 3 19 5 3
1 50209 3 19 5 3
Join、merge、catを試しましたが、期待どおりに動作しませんでした。私は初心者です。これをどのように実行できるのかというアイデアはありますか?
(編集者注:あなたが提供した実際のデータを使用して説明した作業の例です。)
chr position samp1 samp2
1 3774318 1 0
1 3774319 1 0
1 3775200 2 1
1 3775201 0 1
1 3775202 70 10
1 3775203 7 1
1 3775204 270 12
1 3775205 3 1
1 3775206 5 13
1 3775207 7 1
1 3775208 0 1
1 3775209 0 18
ベストアンサー1
別のawk
方法。NA
入力ファイルの1つに特定のバリエーションが存在しない場合は、このファイルが印刷されます。
awk '{ if(FNR==1){files[fnum++]=FILENAME}else{var[$1"\t"$2][FILENAME]=$3}} END{ for(v in var){for(file in files){if(! var[v][files[file]]){var[v][files[file]]="NA"}}}printf "chr\tposition "; for(i=1;i<=fnum;i++){printf "value-samp%s\t",i;} print "";for(v in var){ printf "%s ",v; for(file in var[v]){if(file in var[v]); else{var[v][file]="NA";} printf "%s\t", var[v][file] } print ""}}' s1 s2
または簡潔さがあまり好きではない場合:
awk '{
if(FNR==1){
files[fnum++]=FILENAME
}
else{
var[$1"\t"$2][FILENAME]=$3
}
}
END{
for(v in var){
for(file in files){
if(! var[v][files[file]]){
var[v][files[file]]="NA"
}
}
}
printf "chr\tposition ";
for(i=1;i<=fnum;i++){
printf "value-samp%s\t",i;
}
print "";
for(v in var){
printf "%s ",v;
for(file in var[v]){
if(file in var[v]);
else{
var[v][file]="NA";
}
printf "%s\t", var[v][file];
}
print "";
}
}' s1 s2
s1
とをs2
使用している実際のファイル名に変更します。サンプル入力で上記のコマンドを実行すると、以下が返されます。
chr position value-samp1 value-samp2
1 3774318 1 NA
1 3775200 2 1
1 3774319 1 NA
1 3775201 7 1
1 3775202 70 10
1 3775203 7 1
1 3775204 270 12
1 3775205 3 1
1 3775206 5 13
1 3775207 NA 1
1 3775208 NA 1
1 3775209 NA 18