次の例に示すように、スペースで区切られたテーブルがあります。
A 101
B 92 102
C 83 93 103
D 74 84 94 104
︙
私はこれを得たいと思います:
サンプルAに関連する値を持つすべての2番目の列(サンプルBの最初の値で始まる)が1行に変わり(つまり、最初の行全体に続いて、各後続行の2番目のフィールドがオーム)に変わります。
関連する値を持つサンプルBとすべての2番目の列(サンプルCの最初の値で始まる)が1つの行に変わり(つまり、2番目の行全体に続いて、後続の各行の2番目のフィールドがオーム)。- など。
私の出力の最初の4行のうち最初の5列は次のとおりです。
A 101 92 83 74 …
B 92 102 83 74 …
C 83 93 103 74 …
D 74 84 94 104 …
答え1
awk '
{
a[NR]=$0
b[NR]=$2
}
END{
for(i=1;i<=NR;i++){
k=i+1
printf("%s ",a[i])
for(j=k;j<=NR;j++)
printf("%s ",b[j])
print ""
}
}' table.file
まず、スクリプトは(行番号)で索引付けされた2つの配列(およびa
)b
を作成します。配列のすべての要素NR
に配列のすべての要素を追加する代わりに、最初の要素を除外します。メモリが制限されている場合は、入力ファイルを2回渡して同じ操作を実行できます。a
b
k
awk '
NR==FNR{
b[NR]=$2
rows=NR
next
}
{
printf("%s ",$0)
for(j=FNR+1;j<=rows;j++)
printf("%s ",b[j])
print ""
}
}' table.file table.file