столбец awk sum на основе соответствующего шаблона заголовка

#awk

#awk

Вопрос:

У меня есть файл с ~ 10 000 столбцами и ~ 20 000 строками в следующем формате

 Id  A_1 A_2 A_3 B_2 B_5 C_1
T1  0   1   1   6   1   0
T2  1   1   1   0   0   1
T3  2   0   3   1   1   5
T4  1   1   1   2   3   1 
  

В строке заголовка 1-й столбец — это идентификатор. Начиная со 2-го столбца и далее приводится имя образца в следующем формате sampleName_batch#. Теперь я хочу добавить все значения для идентификаторов на основе sampleName и получить sampleName и итоговое значение в выходных данных. Мой ожидаемый результат

 Id  A   B   C
T1  2   7   0
T2  3   0   1
T3  5   2   5
T4  3   5   1
  

Я наткнулся на этот ответ https://unix.stackexchange.com/questions/569615/combine-columns-in-one-file-by-matching-header но я не знаю, как изменить всю строку заголовка целиком.

Спасибо

Ответ №1:

Я пытаюсь отредактировать решение, упомянутое в сообщении OP, с другого сайта, его немного подправить в решении, и все строки такие же, как и в нем. Я НЕ настолько близок к знаниям, как «Эд Мортон» awk , поэтому смиренно принимаю его разрешение (надеюсь, с ним все в порядке), пытаясь отредактировать его отличное решение с разных сайтов, не могли бы вы попробовать следовать.

 awk '
NR==1 {
    for (inFldNr=2; inFldNr<=NF; inFldNr  ) {
        sub(/_.*/,"",$inFldNr)
        fldName = $inFldNr
        if ( !(fldName in fldName2outFldNr) ) {
            outFldNr2name[  numOutFlds] = fldName
            fldName2outFldNr[fldName] = numOutFlds
        }
        outFldNr = fldName2outFldNr[fldName]
        out2inFldNrs[outFldNr,  numInFlds[outFldNr]] = inFldNr
    }

    printf "%s%s", $1, OFS
    for (outFldNr=1; outFldNr<=numOutFlds; outFldNr  ) {
        outFldName = outFldNr2name[outFldNr]
        printf "%s%s", outFldName, (outFldNr<numOutFlds ? OFS : ORS)
    }
    next
}
{
    printf "%s%s", $1, OFS
    for (outFldNr=1; outFldNr<=numOutFlds; outFldNr  ) {
        sum = 0
        for (inFldIdx=1; inFldIdx<=numInFlds[outFldNr]; inFldIdx  ) {
            inFldNr = out2inFldNrs[outFldNr,inFldIdx]
            sum  = $inFldNr
        }
        printf "%s%s", sum, (outFldNr<numOutFlds ? OFS : ORS)
    }
}
'  Input_file
  

Что добавлено в уже существующий код Ed:

  1. Добавьте sub функцию для замены всего после _ в первой строке (заголовок).
  2. Удален t как разделитель, поскольку образцы OP НЕ разделены табуляцией.

Комментарии:

1. Отличная работа над улучшением!

2. @RavinderSingh13 я виноват, что спрашиваю вас снова. Что делать, если у меня семь столбцов идентификатора вместо одного столбца? Спасибо

3. @Ashi, привет, Аши, мне жаль, что я не понял, не могли бы вы, пожалуйста, сообщить мне, если это новый вопрос, спасибо.

4. @RavinderSingh13 Я просто редактирую вопрос для измененного входного файла.

5. @Ashi, ооо, пожалуйста, не редактируйте СТАРЫЙ вопрос, так как это всех смутит. Пожалуйста, отмените изменения в этом вопросе и откройте новый вопрос для ваших требований, спасибо.