मेरे पास निम्न प्रारूप में ~ १०,००० कॉलम और ~ २०,००० पंक्तियों वाली एक फ़ाइल है

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 

शीर्ष लेख पंक्ति में, पहला स्तंभ आईडी है। दूसरे कॉलम से आगे निम्न प्रारूप में नमूना नाम हैं sampleName_batch#। अब, मैं नमूना नाम के आधार पर आईडी के लिए सभी मान जोड़ना चाहता हूं और आउटपुट में नमूना नाम और योग मूल्य है। मेरा अपेक्षित आउटपुट है

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 लेकिन मुझे नहीं पता कि पूरी हेडर पंक्ति को कैसे संशोधित किया जाए।

धन्यवाद

awk
2
Ashi 25 सितंबर 2020, 11:26

1 उत्तर

सबसे बढ़िया उत्तर

मैं क्रॉस साइट से ओपी की पोस्ट में उल्लिखित समाधान को संपादित करने की कोशिश कर रहा हूं, इसका समाधान में थोड़ा सा बदलाव है और सभी लाइनें वैसी ही हैं जैसी इससे हैं। मैं 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

पहले से मौजूद एड कोड में क्या जोड़ा जाता है:

  1. पहली पंक्ति (हेडर) में _ के बाद सब कुछ स्थानापन्न करने के लिए एक sub फ़ंक्शन जोड़ें।
  2. \t को सीमांकक के रूप में हटा दिया गया क्योंकि OP के नमूने टैब सीमित नहीं हैं।
4
RavinderSingh13 25 सितंबर 2020, 12:06