私の目標は、サブディレクトリに移動してSUBと呼ぶことです。これには、それぞれ5つの列があり、常に同じ数の行を持つ多くのテキストファイルがあります。 2-5のすべての列を合計し、最初の列を保持してからファイルを出力する大きな「合計」ファイルが必要です。ファイル数が少ないことがわかっている場合は、次のようにできます。
cd SUB
numfiles=(*)
numfiles=${#numfiles[@]}
if [ $numfiles = 1 ]
then
paste * | awk '{print $1, $2, $3, $4, $5}' > sum
fi
if [ $numfiles = 2 ]
then
paste * | awk '{print $1, ($2+$7), ($3+$8), ($4+$9), ($5+$10)}' > sum
fi
しかし、SUBのファイル数は1から100までである可能性があるため、これは面倒なアプローチです。ご協力ありがとうございます!
PS新しい「sum」ファイルは入力テキストファイルと同じ形式でなければならず、すべて同じように見えます。たとえば、SUBに項目を含む2つのファイルが含まれている場合
1 2 3 4 5
2 2 3 4 5
そして
1 4 2 7 1
2 2 5 1 9
その後、「sum」ファイルは次のようになります。
1 6 5 11 6
2 4 8 5 14
答え1
awk '
NR==FNR {
# assuming column 1 is the same for all files, remember it.
# only need to do this for the first file
col1[FNR] = $1
}
{ for (i=2; i<=NF; i++) sum[FNR,i] += $i }
END {
for (i=1; i<=FNR; i++) {
printf "%s", col1[i]
for (j=2; j<=NF; j++) printf "%s%s", OFS, sum[i,j]
print ""
}
}
' file1 file2
1 6 5 11 6
2 4 8 5 14
nawk、gawk、およびmawkで作業する必要があります。
答え2
ここです。これは実際にgawk
バニラの代わりに使用されますawk
。本当にtrueを使用する必要がある場合は、awk
構造h[x][y]
をh[x ";" y]
。
cd SUB
awk '
BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" }
{ h[FNR][1] = $1; for (n=2; n<=5; n++) { h[FNR][n] += $n } }
END { for (r in h) { print h[r][1], h[r][2], h[r][3], h[r][4], h[r][5] } }
' *
サンプル入力に基づいて予想される出力を提供します。
PROCINFO
コメントに提案されているように設定を追加しました。