他の列(この簡単な例では3つの列)を含むファイルがあります。これらの行には、さまざまなレプリケーション(Replicate_A、Replicate_B、Replicate_C)のデータが含まれます。ただし、毎回コピーされる行数は同じではありません(例:3、4、5行)。私が知っている唯一のことは、各反復が数字1で始まるということです。名前が重複する追加の列を追加したいと思います。この列を追加する方法について提案がありますか? [追加]列に追加する名前のリストを含む追加ファイルを作成できます。どんなアドバイスでも役に立ちます。
私のファイルはタブ区切りのファイルです。
1 x x
2 x x
3 x x
4 x x
1 x x
2 x x
3 x x
1 x x
2 x x
3 x x
欲しいファイル
1 x x Replicate_A
2 x x Replicate_A
3 x x Replicate_A
4 x x Replicate_A
1 x x Replicate_B
2 x x Replicate_B
3 x x Replicate_B
1 x x Replicate_C
2 x x Replicate_C
3 x x Replicate_C
答え1
AWKを使用し、追加する名前をリストする別々のファイルを使用してください。
#!/usr/bin/awk -f
BEGIN { FS = "\t"; OFS = FS; idx = 0 }
FNR == NR { names[NR] = $0 }
FNR < NR && $1 == 1 { idx++ }
FNR < NR { $(NF + 1) = names[idx]; print }
これは、タブを入力と出力のフィールド区切り文字として使用するようにAWKを設定します。最初のファイルに追加する名前が含まれているとします。これはnames
配列として読み込まれます。最初のファイルの後のファイルに移動すると、最初のフィールドが1であることを確認してから、配列インデックスを増やした後、行の末尾に現在の名前を追加します。
別の名前のリストはありません。
#!/usr/bin/awk -f
BEGIN { FS = "\t"; OFS = FS; idx = 0 }
$1 == 1 { idx++ }
{ $(NF + 1) = sprintf("Replicate_%c", 64 + idx); print }
どちらの場合もエラー処理はありません。最初のバリアントでは、名前がすべて消費されると空の文字列が使用されます。パート2では、Z以降の文字セットを調べます。
答え2
文字の代わりに数字を使用できる場合は、awkで簡単にこれを行うことができます(サンプルfile
データの実行出力を使用してデータがタブで区切られsed -i 's/ */\t/g'
ているため、すべての連続するスペースをタブに置き換えます)。
$ awk -F"\t" -vOFS="\t" '{if($1==1){num++}{print $0,"Replicate_"num}}' file
1 x x Replicate_1
2 x x Replicate_1
3 x x Replicate_1
4 x x Replicate_1
1 x x Replicate_2
2 x x Replicate_2
3 x x Replicate_2
1 x x Replicate_3
2 x x Replicate_3
3 x x Replicate_3
文字が必要な場合は少し複雑ですが、悪くはありません。
$ awk '{
if(NR==FNR){
a[++n]=$1
}
else{
if($1==1){
num++
}
print $0,"Replicate_"a[num]
}
}' <(printf '%s\n' {A..Z}) file
1 x x Replicate_A
2 x x Replicate_A
3 x x Replicate_A
4 x x Replicate_A
1 x x Replicate_B
2 x x Replicate_B
3 x x Replicate_B
1 x x Replicate_C
2 x x Replicate_C
3 x x Replicate_C