perl -ane 'print if($F[3] =~ /^\w,\w/$);' file
-n
говорит жемчугу обрабатывать infile одна строка во время, передавая каждую строку командам, указанным в -e
. -a
говорит жемчугу разворачивать каждую строку вокруг разделителя полей (это принимает значение по умолчанию для интервала), и присвойте это названному массиву @F
. Результат для каждой строки, мы можем обработать его и использование $F[n]
обращаться к энному элементу той строки.
Мы затем тестируем если поле 4 $F[3]
содержит запускаются строки ^
, словесный символ \w
сопровождаемый запятой и затем другим словесным символом \w
и затем конец строки $
. Если это следует за нами print
строка.
Если те "словесные символы" всегда будут Цитозином, Аденином, Гуанином и Тимином, Вы могли бы сделать его более явным с:
perl -ane 'print if($F[3] =~ /^[GATC],[GATC]$/);' file
Я думаю, что это то, что вы хотите
awk '{sum+=$9;a[x++]=$9;b[$9]++}b[$9]>Mode{Mode=$9}END{print "Mean: " sum/x "\nMedian: "a[int((x-1)/2)]"\nMode: " Mode}' file
, уложил neater
awk '
{
sum+=$9
a[x++]=$9
b[$9]++
}
b[$9]>Mode{Mode=$9}
END{
print "Mean: " sum/x
print "Median: "a[int((x-1)/2)]
print "Mode: " Mode
}' file
, также добавлю какую-нибудь логику для сравнения, но я на самом деле не знаю, что вы пытаетесь сравнить как Переменная только называется X, Y, Z и может иметь или не может иметь правильные уравнения
Я благодарен за предоставленный код user78605
, так как он помог мне найти медиану в моих запросах. Однако в вышеупомянутом коде не учитываются определенные условия, необходимые для правильного вычисления медианы.
«abc»
, «28b»
, «h2f»
, ""
и так далее). Ниже приводится мое расширение кода с учетом вышеупомянутых условий:
awk -F',' '
{col=$1}{if((col ~ /^-?[0-9]*([.][0-9]+)?$/) && ($0!=""))
{
sum+=col;
a[x++]=col;
b[col]++
if(b[col]>hf){hf=b[col]}
}
}
END{n = asort(a);idx=int((x+1)/2)
print "Mean: " sum/x
print "Median: " ((idx==(x+1)/2) ? a[idx] : (a[idx]+a[idx+1])/2)
for (i in b){if(b[i]==hf){(k=="") ? (k=i):(k=k FS i)}{FS=","}}
print "Mode: " k
}' file
Решение проблемы №1:
col = $ 1
# легче изменить столбцы, если хранится в переменной.
(col ~ /^-?[0-9 ]*([.pting[0-9 ]+)?$/)
# Строка должна содержать только цифры, точку (десятичный разделитель) или тире (знак минус). [Не учитывается только научное обозначение.]
($ 0! = "")
# вся строка не должна быть пустой.
В соответствующих строках выполните следующие операции цикла:
sum + = col
# (Сокращение отsum = sum + col
.) Сумма всех значений.
a [x ++] = col
# Каждое значение сохраняется в массиве.
b [col] ++
# Значения вcol
обрабатываются как суррогатные ключи массиваb
. Следовательно, вb
только столько элементов, сколько уникальных значений вcol
.Этот итератор создает массив значений частоты. (Сокращение отb [col] = b [col] +1
.)
if (b [col]> hf) {hf = b [col]}
#Lethf
означает «самая высокая частота». Переберите все частоты и обновитеhf
, только если будут обнаружены более высокие частоты.hf
изначально "" (ничего).
Решение проблемы №2:
После завершения операций цикла:
Отсортируйте значения, хранящиеся в массиве:
Это важно отметить, что исходные индексы массиваn = asort (a)
a
варьировались от «0» до «x-1». Помимо сортировки, новый диапазон индекса составляет от «1» до «x». Вот почему я используюint ((x + 1) / 2)
вместо
int ((x-1) / 2)
в качестве индекса, который содержит медиану - или меньшее из двух чисел, которые будут усреднены до медианы.
Решение проблемы №3:
((idx == (x + 1) / 2)? a [idx]: ( a [idx] + a [idx + 1]) / 2)
Это сокращенное обозначение конструкции if-else:
Ifint ((x + 1) / 2)
равно(x + 1) / 2
, тогда количество значений нечетное, а медиана будетa [idx]
. Если это не так,int ()
округлит(x + 1) / 2
в меньшую сторону до ближайшего целого числа, означающего, что количество значений четное. В этом случае среднее значениеa [idx]
иa [idx] +1
будет медианным.
Решение проблемы №4:
для (i in b) {if (b [i] == hf) {(k == "")? (k = i) :( k = k FS i)} {FS = ","}}
Посколькуhf
- это значение, которое представляет наивысшую частоту в наборе данных, если любое значение b равноhf
, его суррогатный ключ - это режим или, по крайней мере, один из режимов.
Этот код объединяет все суррогатные ключи,i
, которые соответствуют критерию, и сохраняет их в переменной,k
, который может быть напечатан в одной строке с заголовком «Режим».
-F
следует настроить в соответствии с тем, какой символ используется в качестве разделителя столбцов в файле.
Если в первой строке файла есть заголовки, добавьте NR> 1
перед {col = $ 1}
.
FS
использовалась для объединения двух переменных. Использование FS
особенно полезно, когда кто-то решает не использовать разделитель. То есть FS = ""
.
Следующие данные использовались для экспериментов с целью создания сценария:
10
20
10
20.5
50
30
40
50
10
30
20.5
-h
h
4.35
-537
0
-0
30
d
.
Mean: -13.2281
Median: 20.25
Mode: 10,30