Мне нужно складывать строки и выбирать столбцы. Я хочу использовать
Файл
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))
Единственное, что мне нужно, это условие для суммирования только определенных строк
Хорошо, есть ответ, который я хотел получить:
#!/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
, что является правильным
вы можете передавать переменные в 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
, а затем добавьте ot к условию || 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