別の列で数字が見つかるたびに、変更される数字または文字列を含む列をどのように追加できますか?

別の列で数字が見つかるたびに、変更される数字または文字列を含む列をどのように追加できますか?

他の列(この簡単な例では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

関連情報