Как сложить определенные столбцы с помощью awk в скрипте unix

Мне нужно складывать строки и выбирать столбцы. Я хочу использовать

Файл

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))

Единственное, что мне нужно, это условие для суммирования только определенных строк

0
22.12.2016, 13:18
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 , что является правильным

0
28.01.2020, 04:49

вы можете передавать переменные в 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
0
28.01.2020, 04:49

Теги

Похожие вопросы