awk:ループにファイル名を持つ列名を追加する

awk:ループにファイル名を持つ列名を追加する

awkループ中に列ヘッダーを追加するのに問題があります。現在、各csvファイルの各行の平均を計算するための次のコードがあります。

for i in *.csv; do  
  awk -F"," 'NR==1 { next }
        { T=0
           for(N=1; N<=NF; N++) T+=$N;
           T/=NF
           print T }' $i > Mean$i
done

したがって、MeanName1.csv、MeanName2.csv...を取得するファイルには、次のものが含まれます。

2.5                3.5                ...
4.2                3.4
1.2                3.9
1.2                3.7

次の内容を含む「平均」ファイルが必要です。

Name1   Name2   ...
2.5     3.5
4.2     3.4
1.2     3.9
1.2     3.7

ループでprint FILENAMEを使用できませんでした。

おすすめメニューとは何ですか?ありがとう

答え1

Join Output Fileを使用するのが最も簡単ですが、pasteファイル名をヘッダーとして追加する方法がわからないようです。ただし、ループ内の中間出力ファイルに対してこれを手動で実行できるため、次のようになります。

for i in *.csv; do
    out="Mean$i"
    echo "${i%.csv}" > "$out"
    awk -F"," 'NR==1 { next }
        { T=0
           for(N=1; N<=NF; N++) T+=$N;
           T/=NF
           print T }' "$i" >> "$out"
done
paste Mean*.csv > All.csv

${i%.csv}$iサフィックス値のみを削除するため、sum.csvには次の出力が与えられます。foo.csvbar.csv

bar     foo
4.33333 2.5
3.8     3.5

各入力行の最初の行()もスキップされていますNR==1 { next }。便利なヘッダーが含まれている場合は、上記で追加したヘッダーを変更してからNR==1 { print; next }削除して使用することもできます。echo

関連情報