Добавьте список значений столбцов A и B, разделенных пробелом, и покажите результат суммирования [дубликат]

Dec 29 2020

У меня есть файл с названием 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

Ответы

5 αғsнιη Dec 29 2020 at 00:00

С 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
ctac_ Dec 30 2020 at 01:56

Это хорошая работа для постоянного тока.

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.
Подробнее объясните по запросу.