入力ファイルの特定の列に数式を適用し、他のすべての列をそのまま渡すより良い方法

入力ファイルの特定の列に数式を適用し、他のすべての列をそのまま渡すより良い方法

テキストテーブルに与えられたデータを入力するために単純な数式を適用する必要があることがよくあります。

最初は、ユースケースごとに特定の小さな関数を作成しました。その後、「汎用コード」を bash 関数にリファクタリングしました。これはうまくいきますが、理想的ではありません。

私の「以前のソリューション」は次のとおりです。すべてのフィールドを繰り返して確認/応答します。

calcc(){
  awkcmd='{for (i=1;i<=NF;i++){if (i==col) printf "%s ",'
  awkcmd+="$2"
  awkcmd+='; else printf "%s ", $i ;}; print "";}'
  awk -v col=$1 "$awkcmd" | column -t
}

人為的な使用例:

"-output の groupName(Column4) をls -ldayNumber(Column7) 2乗に置き換えます。"

$ ls -l | calcc 4 '$7*$7'

もっと良い方法や今まで見ていない(POSIX)ツールはありますか?

$1..$n編集:@RalphRönnquistは書くことができるので、より短いバージョンが提案されるかもしれないと指摘しました。これはprintデフォルトawkの動作なので、より短縮できます。 ==>

$ calcc() { awk "\$$1=$2" | column -t; }
$ calcc-nc() { awk "\$999=$1" | column -t; }

2番目の関数はNよく最後に計算結果をリストします。

答え1

awkこれは素晴らしいですが、次のようにすればより簡単に実行できます。

calcc() {
    awk "{\$$1=$2;print}" | column -t
}

これが良いかどうかはあなたの選択です。

関連情報