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番目のフィールドの名前から取得されます。
このスクリプトはパラメータを使用しません。
答え2
Phase名グループが最後のPhaseより大きいseqnoで始まる可能性がある場合、seqnoには依存しないかもしれませんが、Phasenameに依存する方が良いかもしれません。 Kusalanandaが提案した適応を試すこともできます。
awk '
FNR == 1 {split ($0, header)
next
}
$3 != LAST {printf TMPRS; TMPRS = ORS
for (i = 1; i <= NF; ++i) printf ("%s%s%s", (i>3)?$3"_":_, header[i], (i==NF?ORS:OFS))
}
{LAST = $3
print
}
' OFS="\t" filename1 filename2