हाय विशेषज्ञ मैं एक विशेष प्रतीक (यहां>) पर टेक्स्ट फ़ाइल के एक बड़े कॉलम को विभाजित करना चाहता हूं और नीचे दिए गए उदाहरण में दिए गए अनुसार विभाजित फ़ाइल को एक साथ चिपकाना चाहता हूं:

मैंने split -l 4 inputfile > otputfile के साथ प्रयास किया लेकिन यह मदद नहीं करता है। मुझे आशा है कि कुछ विशेषज्ञ निश्चित रूप से मेरी मदद करेंगे।

उदाहरण के लिए मेरे पास नीचे दिए गए डेटा है:

>
1
2
2
4
>
4
3
5
3
>
4
5
2
3

और मुझे नीचे की तरह आउटपुट चाहिए

1 4 4
2 3 5
2 5 2
4 3 3
-1
user14037076 7 सितंबर 2020, 13:16

3 जवाब

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

संपादित करें: ओपी की टिप्पणी के अनुसार > चिह्न के बीच की संख्या नियमित नहीं हो सकती है यदि ऐसा है तो मैं निम्नलिखित के साथ आया हूं, जहां यह जोड़ देगा NA > की विशिष्ट घटना के लापता होने के लिए। जीएनयू awk के साथ लिखित और परीक्षण किया गया है और यहां आपकी इनपुट_फाइल में कोई खाली लाइन नहीं है।

awk -v RS=">" -v FS="\n" '
FNR==NR{
  max=(max>NF?max:NF)
  next
}
FNR>1{
  for(i=2;i<max;i++){
    val[i]=(val[i]?val[i] OFS:"")($i?$i:"NA")
  }
}
END{
  for(i=2;i<max;i++){
    print val[i]
  }
}' Input_file Input_file


क्या आप जीएनयू awk में दिखाए गए नमूनों के साथ निम्नलिखित, लिखित और परीक्षण करने का प्रयास कर सकते हैं।

awk '
/^>/{
  count=""
  next
}
{
  ++count
  val[count]=(val[count]?val[count] OFS:"")$0
}
END{
  for(i=1;i<=count;i++){
   print val[i]
  }
}' Input_file

स्पष्टीकरण: ऊपर के लिए विस्तृत विवरण जोड़ना।

awk '                                               ##Starting awk program from here.
/^>/{                                               ##Checking condition if a line starts from > then do following.
  count=""                                          ##Nullifying count variable here.
  next                                              ##next will skip all further statements from here.
}
{
  ++count                                           ##Incrementing count variable with 1 here.
  val[count]=(val[count]?val[count] OFS:"")$0       ##Creating val with index count and keep adding current lines values to it with spaces.
}
END{                                                ##Starting END block for this awk program from here.
  for(i=1;i<=count;i++){                            ##Starting a for loop from here.
   print val[i]                                     ##Printing array val with index i here.
  }
}' Input_file                                       ##Mentioning Input_file name here.
3
RavinderSingh13 7 सितंबर 2020, 14:41

जैसा कि आपने पायथन को टैग किया है एक पायथन समाधान:

columns = []  # List of columns, each column will be another list of lines
with open('example.txt', 'r') as f:
    for line in f:
        line = line.strip()  # Remove leading and trailing white spaces like "\n"
        if line == '>':
            columns.append([])  # If we find a ">" append a new column
        else:
            columns[-1].append(line)  # else append the line to the last column

with open('output.txt', 'w') as f:
    for row in zip(*columns):  # zip(*columns) trasposes the matrix
        f.write(" ".join(row) + "\n")
1
Adirio 7 सितंबर 2020, 15:08

कृपया नीचे दिए गए कार्यक्रम का प्रयास करें

a=""">
1
2
2
4
>
4
3
5
3
>
4
5
2
3"""
res=[[c for c in b.split("\n") if c] for b in a.split(">") if b]
print("\n".join([" ".join([item[i] for item in res]) for i in range(len(res[0]))]))

आउटपुट

1 4 4
2 3 5
2 5 2
4 3 3

अगर आप फाइल से पढ़ना चाहते हैं। इस कार्यक्रम का उपयोग नीचे के रूप में करें।
यह ऊपर जैसा ही आउटपुट देता है।

with open("input.txt","r") as f, open("output.txt","w") as f1:
    a=f.read()
    res=[[c for c in b.split("\n") if c] for b in a.split(">") if b]
    f1.write("\n".join([" ".join([item[i] for item in res]) for i in range(len(res[0]))]))
1
Liju 7 सितंबर 2020, 13:45