Unixスクリプトでawkを使用していくつかの列を追加する方法

Unixスクリプトでawkを使用していくつかの列を追加する方法

行を追加して列を選択する必要があります。使いたい

文書

1 2 3
1 2
1

パラメーターがない場合、スクリプトは以下を返す必要があります。

6 (1st row)
3 (2nd row)
1 (3rd row)

この部分のために私が作成したコードは次のとおりです。

awk '{ for(i=1; i<=NF;i++) sum+=$i; print(sum); sum=0 }' $FILE

パラメーター 1 と 2 (列数) を使用すると、スクリプトは列 1 と 2 のすべての行を追加する必要があるため、以下を返す必要があります。

3 (1st+2nd column)
3 (1st+2nd column)
1 (1st+2nd (blank) column))

私が必要とする唯一のものは、特定の行だけを合計する条件です。

答え1

変数を渡すことawkができ、コマンドは次のようになります。

awk -v col1=1 -v col2=2 '{ for(i=1; i<=NF;i++) {if (i == $col1 || i == $col2 ) sum+=$i}; print(sum); sum=0 }' $FILE
  • -v var=value プログラム変数varに値を割り当てます。

好きなだけ列を追加できます。追加し、-v colx=value条件に追加します。|| i == $colx

列番号をシェルスクリプトに渡すには、それを配列に追加して変数をcolumnsArray作成すると、columns=$(echo "${columnsArray[@]}")コマンドは次のようになります。

awk -v outCols="$columns" 'BEGIN{split(outCols, cols, " ")} { for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' $FILE

例えば

#!/bin/bash
columns=$(echo "$@")
awk -vcolss="$columns" 'BEGIN{split(colss, cols, " ")}{ for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' test

次を返します。

3
3
1

答え2

さて、私が得たい答えは次のとおりです。

    #!/bin/bash
    PLIK=$1
    shift
    d=${@}
    awk -v c="$d" 'BEGIN {split(c,a," ")}{c=0; for(i in a) c+=$a[i]; print c}' $FILE

./script.sh file.txt 1 2戻ってくる3 3 1./file.sh file.txt 2 3戻ってくる、5 2 0それが正しい

関連情報