Вы можете сделать это довольно легко в awk
, просто сохранив текущую запись с минимальным полем 4 th для данного поля 1 st . Вы должны обработать вывод строки заголовка и сохранить первую запись, чтобы начать сравнение, что вы можете сделать, работая с первой записью NR==1
(или первой в каждом обработанном файле, FNR==1
).
Вы можете сохранить первый минимум в массиве, проиндексированном первым полем, и сохранить исходную запись, содержащую значения, работающие с записью 2 nd . Тогда нужно просто проверить, не совпадает ли первое поле с последним, если это так, выведите минимальную запись для последней и продолжайте, пока у вас не кончатся записи. ( примечание: это предполагает, что первые поля появляются в порядке возрастания, как и в вашем файле) Затем вы используете правило END
для вывода окончательной записи.
Вы можете поместить это вместе следующим образом:
awk -F, '
FNR==1 {print; next}
FNR==2 {rec=$0; m[$1]=$4; next}
{
if ($1 in m) {
if ($4 < m[$1]) {
rec=$0
m[$1]=$4
}
}
else {
print rec
rec=$0
m[$1]=$4
}
}
END {
print rec
}' file
(где ваши данные находятся в файле file
)
Если ваше первое поле не в порядке возрастания, вам необходимо сохранить текущий минимум запись в массиве также. (например, превратить rec
в массив, индексированный первым полем, содержащим итоговую запись в качестве значения). Затем вы отложите зацикливание обоих массивов до правила END
для вывода минимальной записи для каждого первого поля.
Пример использования / Вывод
Вы можете обновить имя файла, совпадающее с именем файла, содержащим ваши данные, а затем для проверки все, что вам нужно сделать, это выбрать-скопировать выражение awk
и вставить его средней мышью в xterm в каталоге, содержащем ваш file
, например,
$ awk -F, '
> FNR==1 {print; next}
> FNR==2 {rec=$0; m[$1]=$4; next}
> {
> if ($1 in m) {
> if ($4 < m[$1]) {
> rec=$0
> m[$1]=$4
> }
> }
> else {
> print rec
> rec=$0
> m[$1]=$4
> }
> }
> END {
> print rec
> }' file
ID,y,z,p-value
1,a,b,1.2e-10
2,c,d,3e-7
3,e,f,2e-8
Посмотрите вещи и дайте мне знать, если у вас есть вопросы.