Добавьте список значений столбцов A и B, разделенных пробелом, и покажите результат суммирования [дубликат]
У меня есть файл с названием fold.txt
. В каждой строке есть два значения, разделенных пробелом. Если я скажу, что первое значение представляет столбец A, а второе значение после пробела - столбец B, тогда как я могу сложить все значения столбца A и все значения столбца B и показать сумму каждого столбца индивидуально?
Я жду чего-то вроде этого:
$ cat fold.txt
100 500
200 300
700 100
Вывод:
Total count Column A = 1000
Total count column B = 900
Ответы
С awk
:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
на языке awk, который является инструментом для обработки текста, $1
представляет значение первого столбца, $2
представляет значение второго столбца, $3
для третьего и так далее, а один специальный NF
представляет идентификатор последнего столбца и, соответственно $NF
, значение последнего столбца (так что вы можете заменить $2
выше с $NF
тоже; и да, вы поймаете это, когда NF
это последний идентификатор столбца, поэтому значение переменной сообщает вам, сколько столбцов у вас есть (обновление значения для каждой строки awk считывается из ввода)).
Чтобы обработать крайний случай, когда входной файл пуст и по-прежнему получает числовой вывод, мы добавляем 0 к результату, заставляя awk
выводить числовой результат.
столбцы (или поля) awk
выделяются FS
переменной ( F eild S eparator), которая по умолчанию использует пробел / табуляцию. если вы хотите, чтобы столбцы были разделены на разные символы, вы можете переопределить его с помощью -F
параметра awk
как в:
awk -F'<character-here>' '...' infile
или внутри BEGIN{...}
блока, например FS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
например, для входного файла, как показано ниже (теперь это запятая вместо пробела):
100,500
200,300
700,100
вы можете написать свой awk
код следующим образом:
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Или внутри BEGIN
блока:
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Немного сложнее и суммировать все N столбцов вашего входного файла в следующем примере:
100,500,140,400
200,300,640,200
700,100,400,130
Итак, мы говорили NF
в первом абзаце (значение NF говорит вам, сколько столбцов у вас есть (обновляется для каждой строки)):
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
единственное, что здесь нововведения, это то, что мы использовали awk
массив для адресации того же идентификатора столбца, взятого из значения i
и добавления их значений $i
в этот массив (индекс / ключи этого массива - это идентификаторы столбцов); затем в END{...}
блоке мы перебираем наш массив по клавишам, которые он видел, затем сначала распечатываем идентификатор столбца, а затем сумму тех, которые рядом с ним, вы увидите результат, как показано ниже:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
Это хорошая работа для постоянного тока.
dc сначала считывает данные из fold.txt и после кода из sum_col_dc.
Используйте это так: dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
Немного подробнее:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
Наслаждайтесь dc.
Подробнее объясните по запросу.