Как создать функцию для суммирования необходимого нескольких столбцов

Дополнительная информация, например, какую ОС Unix вы используете(Ubuntu, Fedora, Debian)или тип микрофона(динамический, конденсаторный)и способ его подключения к вашей звуковой карте(Разъем 3,5 мм например, разъем для наушников для MP3-плееров, штекер 1/4 дюйма, USB, кабель XLR с интерфейсом или без него?)было бы неплохо увидеть. А пока...

У меня была противоположная проблема с Audacity и моим динамическим микрофоном Audio Technica 2005USB. Выигрыша было почти совсем ничего! Начиная с закрытого Audacity, после подключения микрофона я щелкнул значок шестеренки Ubuntu 16.04 и нажал System_Settings>Sound.(Здесь нам было бы полезно узнать вашу ОС, но не беспокойтесь. Если вы достаточно умны, чтобы использовать Linux, вы достаточно умны, чтобы понять, как добраться до настроек звука вашей ОС! :-D)В окне настроек звука я переключил Inputна только что подключенный микрофон. Сразу же я увидел гистограмму в виде аналогового измерителя VU -, показывающую интенсивность текущего звука, подаваемого в микрофон. После произнесения "ТЕСТ...1. 2. 3" в микрофон при четком, нормальном уровне речи, на гистограмме загорались только около двух из 30 полос гистограммы. Над гистограммой находился ползунок, помеченный Input Volume. корректировки, произнося «ТЕСТ... 1. 2. 3.» в микрофон, я обнаружил, где гистограмма загорается в диапазоне от 75 до 80. Затем я открыл Audacity и убедился, что вход для Audacity выбран как(Кстати, :Если у вас есть наушники или динамики, выключите их, чтобы не повредить слух!)Говоря "ТЕСТ... 1. 2. 3." на звуковой панели Audacity прыгает и остается в красном, пока я говорил. Поэтому я прыгал туда и обратно между настройками звука моей ОС и Audacity, регулируя входную громкость до «ТЕСТ... 1. 2. 3»., время от времени погружаясь в красную зону на индикаторе уровня записи Audacity в верхней части окна Audacity. Это называется «настройка уровня микрофона». После того, как уровень микрофона был установлен, я записал несколько царапин ces и воспроизвел его. Звучало нормально!

Попробуйте повозиться с настройками звука и посмотрите, улучшит ли качество звука уменьшение входной громкости вашей системы. Если нет, дайте нам больше информации. Кто-то еще может иметь представление о причудах, связанных с вашей конкретной ОС, звуковой картой или системой.

2
21.12.2019, 18:43
3 ответа

Используя достаточно новую версию Миллера

$ mlr --csvlite --allow-ragged-csv-input --fs '|' stats1 -a sum -f SAL file.txt
SAL_sum
155

(последняя версия требуется только потому, что ваш ввод рваный т. е. имеет завершающий пустой столбец без соответствующего имени в заголовке ). Вы можете легко суммировать несколько столбцов в Miller, передав их имена в виде списка, разделенного запятыми, в параметр -f:

... stats1 -a sum -f SAL,COST,PER,TAG...

Аналогично с GNU Datamash

$ datamash -Ht '|' sum SAL,COST,PER,TAG < file.txt
sum(SAL)|sum(COST)|sum(PER)|sum(TAG)
155|162|95|210
2
27.01.2020, 21:53

Черпая вдохновение изhttps://stackoverflow.com/a/32616101:

$ col=SAL
$ colnum=$(awk -v RS='|' '/'$col'/{ print NR; exit}' testfile)
$ awk '{FS="|"}{s+='$colnum'}END{print s}' testfile 
18

Хитрость заключается в заключении в кавычки. :Переменные находятся вне одинарных -кавычек.

Это легко завернуть в скриптsumcols.sh:

#!/bin/bash
FILE="$1"
COLUMNS="${@:2}"
for col in $COLUMNS; do
  colnum=$(awk -v RS='|' '/'$col'/{ print NR; exit}' $FILE)
  awk '{FS="|"}{s+='$colnum'}END{print "'$col' ", s}' $FILE
done | column -t

Вызовите его с файлом для обработки в качестве первого позиционного параметра и следуйте за столбцами для обработки. Например.:

$./sumcols.sh testfile SAL COST
SAL   18
COST  24
2
27.01.2020, 21:53

Использованиеawk(и потеря пробелов во входной строке)

myv='SAL|COST|PER|TAG'
awk -v ar="$myv" '
  BEGIN{FS="|"; getline; for (i=1;i<=NF;i++) {if ($i ~ ar) head[i]=0;title[i]=$i}}
  NF>1{for (h in head) head[h]+=$h}
  END{for (h in head) print title[h]":\t"head[h]}
' file

Это предполагает, что сопоставление регулярных выражений уникально. Если нет то...

myv='SAL|COST|PER|TAG'
awk -v ar="$myv" '
  BEGIN{FS="|"; getline; for (i=1;i<=NF;i++) head[$i]=i; split(ar,titles,"|")}
  NF>1{for (i=1; i<=NF; i++) val[i]+=$i}
  END{for (t in titles) print titles[t]":\t"val[head[titles[t]]]}
' file

Выход

SAL:    155
COST:   162
PER:    95
TAG:    210
2
27.01.2020, 21:53

Теги

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