Как получить сумму значений в столбце на основе переменных в другом столбце отдельно? [дубликат]

Для этого вам понадобится цикл по файлам:

for file in *.txt; do
  lines=$(wc -l < "$file")
  if [ "$lines" -lt 3 ]; then
    echo "$file is short enough, not touching it."
  else
    # for testing, you can also use the -i option
    sed -n '1p;$p' "$file" > "$file.new"
  fi
done

Цикл необходим, если у вас есть файлы длиной всего в одну строку. С командой , заданной thrig , они появятся дважды (попробуйте echo 1 | sed -n '1p; $ p' ).

4
27.11.2018, 13:40
3 ответа

Вы были довольно близко. Вы видите, что вы делали неправильно, не так ли? Вы сохраняли одну сумму для каждого значения столбца 1, когда вы должны были держать три.

Это похоже на ответ Иниана , но легко расширяется для обработки любого количества столбцов:

awk -F"\t" '{for(n=2;n<=NF; ++n) a[$1][n]+=$n}
        END {for(i in a) {
                printf "%s", i
                for (n=2; n<=4; ++n) printf "\t%s", a[i][n]
                printf "\n"
             }
        }'

Вместо того, чтобы хранить три массива, как в ответе Иниана, он хранит двумерный -массив.

4
27.01.2020, 20:47

Пока ваш файл разделен табуляцией -, для этого хорошо подходит datamash .

$ datamash groupby 1 sum 2 sum 3 sum 4 < tablefilepath
abc     1       1       1
bcd     14      25      7
cde     20      11      35

Datamash также может работать с вкладками, отличными от -, если вы укажете -t <delimiter>. Но вкладки кажутся наиболее близкими к приведенному вами примеру ввода.

Datamash не будет работать, если ваш ввод разделен произвольным пробелом (т. е. возможными несколькими пробелами, предназначенными для того, чтобы «выглядеть» как вкладка ). Тем не менее, даже если ваши данные выглядят именно так, их легко преобразовать в форму, ожидаемую datamash :

.
sed -i 's/ \+/\t/g' tablefilepath
4
27.01.2020, 20:47

Используя awkсуммируя столбцы 2 -4 на основе 1.

awk -v FS="\t" -v OFS="\t" '{ col1[$1]+=$2; col2[$1]+=$3; col3[$1]+=$4; next } END { for ( i in col1) print i, col1[i], col2[i], col3[i]  }' file
2
27.01.2020, 20:47

Теги

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