#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:
- Добавьте
sub
функцию для замены всего после_
в первой строке (заголовок). - Удален
t
как разделитель, поскольку образцы OP НЕ разделены табуляцией.
Комментарии:
1. Отличная работа над улучшением!
2. @RavinderSingh13 я виноват, что спрашиваю вас снова. Что делать, если у меня семь столбцов идентификатора вместо одного столбца? Спасибо
3. @Ashi, привет, Аши, мне жаль, что я не понял, не могли бы вы, пожалуйста, сообщить мне, если это новый вопрос, спасибо.
4. @RavinderSingh13 Я просто редактирую вопрос для измененного входного файла.
5. @Ashi, ооо, пожалуйста, не редактируйте СТАРЫЙ вопрос, так как это всех смутит. Пожалуйста, отмените изменения в этом вопросе и откройте новый вопрос для ваших требований, спасибо.