awk内の一致に基づいてawk変数を変更します。

awk内の一致に基づいてawk変数を変更します。

gnuplotに送信する前に前処理中のデータファイルがあります。ヘッダー行と複数のデータ行で構成され、多くのデータ型列があります。最初の3つの列は常に同じ型と順序を持ちます。列の総数はファイル内では一定ですが、ファイル間では一定ではありません。 seqnoは1から始まることは保証されていませんが、常に単調に増加します。

データファイル内の任意の場所にヘッダー行を挿入するスクリプトがありますが、現在の一致に応じてそのヘッダーを変更できるようにしたいです。特に$ i変数を4番目の変数に追加したいと思います。 5番目の..endth列はヘッダーです。それ以外は、各場所のタイトルが同じです。

これはスクリプトで実行されるため、ヘッダーに含まれている列数を確認するためにヘッダーを前処理する必要がある場合は簡単に実行できます。

必要なヘッダー置換がない現在のスクリプトは次のとおりです(最後に別のヘッダー例があります)。

header=$(head -n1 $input)
awk -v i=3 -v hdr="$header" 'NR>1 && $i!=p {print "\n\n"hdr}{p=$i} 1' ${input} > ${output}

私の入力例は次のとおりです

#filename       seqno   phasename       a       b       c       scale   Rwp
blah_001.xye    1       corundum        3       3       12      0.001   3
blah_002.xye    2       corundum        3.1     3.1     12.1    0.002   3.5
blah_003.xye    3       corundum        3.2     3.2     12.2    0.001   3.1
blah_001.xye    2       silcon_NIST     5.4     5.4     5.4     0.002   3
blah_002.xye    3       silcon_NIST     5.41    5.41    5.41    0.004   3.5
blah_003.xye    4       silcon_NIST     5.42    5.42    5.42    0.002   3.1

私の現在の出力は次のとおりです

#filename       seqno   phasename       a       b       c       scale   Rwp
blah_001.xye    1       corundum        3       3       12      0.001   3
blah_002.xye    2       corundum        3.1     3.1     12.1    0.002   3.5
blah_003.xye    3       corundum        3.2     3.2     12.2    0.001   3.1


#filename       seqno   phasename       a       b       c       scale   Rwp
blah_001.xye    2       silcon_NIST     5.4     5.4     5.4     0.002   3
blah_002.xye    3       silcon_NIST     5.41    5.41    5.41    0.004   3.5
blah_003.xye    4       silcon_NIST     5.42    5.42    5.42    0.002   3.1

私が望む出力は次のとおりです。

#filename       seqno   phasename       corundum_a       corundum_b       corundum_c       corundum_scale   corundum_Rwp
blah_001.xye    1       corundum        3       3       12      0.001   3
blah_002.xye    2       corundum        3.1     3.1     12.1    0.002   3.5
blah_003.xye    3       corundum        3.2     3.2     12.2    0.001   3.1


#filename       seqno   phasename       silcon_NIST_a       silcon_NIST_b       silcon_NIST_c       silcon_NIST_scale   silcon_NIST_Rwp
blah_001.xye    2       silcon_NIST     5.4     5.4     5.4     0.002   3
blah_002.xye    3       silcon_NIST     5.41    5.41    5.41    0.004   3.5
blah_003.xye    4       silcon_NIST     5.42    5.42    5.42    0.002   3.1

hdr私がやりたいこと:awkでawk変数を変更して入力ファイルに挿入する前に、変数の$i最後の4番目の列に変数を追加するにはどうすればよいですか?hdr

別のファイルで処理するための別の例ヘッダー

#filename   seqno   phasename   temp    temp_err    csL csL_err csG csG_err strL    strL_err    strG    strG_err    B_Na    B_Na_err    B_Mg    B_Mg_err    B_F B_F_err B_H B_H_err B_O B_O_err B_Fe    B_Fe_err    F_occ   F_occ_err   Na_x    Na_x_err    Na_z    Na_z_err    F1_x    F1_x_err    F1_y    F1_y_err    F1_z    F1_z_err    F2_x    F2_x_err    F2_z    F2_z_err    a1  a1_err  a2  a2_err  a3  a3_err  a4  a4_err  a5  a5_err  a6  a6_err  a7  a7_err  s1  s1_err  s2  s2_err  s3  s3_err  a   a_err   b   b_err   c   c_err   al  al_err  be  be_err  ga  ga_err  volume  volume_err  mass    mass_err    MAC MAC_err density density_err LAC LAC_err Lvol    Lvol_err    e0  e0_err  scale   scale_err   wt% wt%_err num_area    num_area_err    r_bragg r_bragg_err r_wp    r_wp_err    r_exp   r_exp_err   gof gof_err
#filename   seqno   phasename   csL csL_err strG    strG_err    a   a_err   b   b_err   c   c_err   al  al_err  be  be_err  ga  ga_err  volume  volume_err  mass    mass_err    MAC MAC_err density density_err LAC LAC_err Lvol    Lvol_err    e0  e0_err  scale   scale_err   wt% wt%_err num_area    num_area_err    r_bragg r_bragg_err r_wp    r_wp_err    r_exp   r_exp_err   gof gof_err
#filename   seqno   phasename   csG strL    F1_x    F1_y        F1_z    volume      gof 

ベストアンサー1

$ awk -f script.awk file
#filename       seqno   phasename       corundum_a      corundum_b      corundum_c      corundum_scale  corundum_Rwp
blah_001.xye    1       corundum        3       3       12      0.001   3
blah_002.xye    2       corundum        3.1     3.1     12.1    0.002   3.5
blah_003.xye    3       corundum        3.2     3.2     12.2    0.001   3.1

#filename       seqno   phasename       silcon_NIST_a   silcon_NIST_b   silcon_NIST_c   silcon_NIST_scale       silcon_NIST_Rwp
blah_001.xye    2       silcon_NIST     5.4     5.4     5.4     0.002   3
blah_002.xye    3       silcon_NIST     5.41    5.41    5.41    0.004   3.5
blah_003.xye    4       silcon_NIST     5.42    5.42    5.42    0.002   3.1

script.awkどこ

BEGIN   { OFS = "\t" }

/^#/    {
    # save header fields

    for (i = 1; i <= NF; ++i)
        header[i] = $i

    next
}

# if column 2 contains a lower number than the previous line
# (or if no previous line with data), then output header
$2 < col2 || !col2 {
    # output blank line if needed
    if (print_blank) {
        print ""
    }
    print_blank = 1

    # print first three headers as-is
    for (i = 1; i <= 3; ++i)
        printf("%s%s", header[i], OFS)

    # prepend column three to remaining headers
    for (i = 4; i < NF; ++i)
        printf("%s_%s%s", $3, header[i], OFS)
    printf("%s_%s%s", $3, header[NF], ORS)
}

# print all lines and save value from column 2
{ col2 = $2; print }

スクリプトは入力データのヘッダーを配列に保存しますheader。 2 番目の列の値が前の行の 2 番目の列の値より低い場合、データを出力する前に新しいヘッダーを出力します。最初のタイトルではなく、タイトルの前に空白行があります。変数列名は、3番目のフィールドの名前から取得されます。

このスクリプトはパラメータを使用しません。

おすすめ記事