行を追加して列を選択する必要があります。使いたい
文書
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
それが正しい