অন্য বহু মাল্টি কলামের পাঠ্য ফাইলটি পেতে কীভাবে একাধিক কলাম পাঠ্য ফাইলটি প্রক্রিয়া করবেন?


17

আমার কাছে একটি পাঠ্য ফাইল রয়েছে:

a   aa  aaa     b   bb  bbb     c   cc  ccc
d   dd  ddd     e   ee  eee     f   ff  fff
g   gg  ggg     h   hh  hhh     i   ii  iii
j   jj  jjj

আমি কীভাবে এটি প্রক্রিয়া করতে পারি এবং এর মতো একটি 2 কলাম ফাইল পেতে পারি:

a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

অথবা এর মতো একটি তিনটি কলাম ফাইল:

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jj

আমি বিশ্রী সমাধান পেতে পছন্দ করি তবে অন্যান্য সমাধানগুলিও স্বাগত।

উত্তর:


1

আপনি এটি জিএনইউ অ্যাডকের একক অনুরোধের মাধ্যমেও করতে পারেন:

reshape.awk

# Set awk to split input at whitespace characters and
# use tab as the output field separator 
BEGIN {
  RS="[ \t\n]+"
  OFS="\t"
}

# Print using OFS or ORS based on the element index
{
  printf "%s", $1 (NR%n == 0 ? ORS : OFS)
}

# Append a missing new-line when last row is not full
END { 
  if( NR%n != 0) 
    printf "\n"
}

এটি এইভাবে চালান:

awk -f reshape.awk n=2 infile

বা ওয়ান-লাইনার হিসাবে:

awk -v n=2 'BEGIN { RS="[ \t\n]+"; OFS="\t" } { printf "%s", $1 (NR%n == 0 ? ORS : OFS) } END { if( NR%n != 0) printf "\n" }' infile

আউটপুট:

a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

বা সাথে n=3:

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj

এটি কি বিন্যাসের স্ট্রিং $1হিসাবে ব্যবহার করে না ? printf
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড: ঠিক আছে, এটি ব্যবহার করা নিরাপদ "%s", ...। আপডেট হয়েছে
থোর

জানানোর জন্য ধন্যবাদ. :) awkউপায় দ্বারা, এই প্রশ্নের আপনার অন্য উত্তরের আদেশে একই প্রযোজ্য ।
ওয়াইল্ডকার্ড

20

প্রতিটি ক্ষেত্রকে একটি লাইন এবং পোস্ট-কলামেটে রাখুন।

এক লাইনে প্রতিটি ক্ষেত্র

TR

tr -s ' ' '\n' < infile

, grep

grep -o '[[:alnum:]]*' infile

sed

sed 's/\s\+/\n/g' infile

বা আরও বহনযোগ্য:

sed 's/\s\+/\
/g' infile

awk

awk '$1=$1' OFS='\n' infile

অথবা

awk -v OFS='\n' '$1=$1' infile

Columnate

পেস্ট করুন

2 কলামের জন্য:

... | paste - -

3 কলামের জন্য:

... | paste - - -

প্রভৃতি

sed

2 কলামের জন্য:

... | sed 'N; s/\n/\t/g'

3 কলামের জন্য:

... | sed 'N; N; s/\n/\t/g'

প্রভৃতি

xargs

... | xargs -n number-of-desired-columns

মুদ্রণের xargsব্যবহার হিসাবে /bin/echo, সাবধান থাকুন যে ডেটা বিকল্পগুলির মতো দেখায় echoতেমন ব্যাখ্যা করা হবে।

awk

... | awk '{ printf "%s", $0 (NR%n==0?ORS:OFS) }' n=number-of-desired-columns OFS='\t'

PR

... | pr -at -number-of-desired-columns

অথবা

... | pr -at -s$'\t' -number-of-desired-columns

কলাম (স্বয়ংক্রিয় প্যাকেজ থেকে)

... | columns -c number-of-desired-columns

সাধারণ আউটপুট:

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj

2
স্ল্যাম ডঙ্ক। +1 স্যার
স্টিভেন পেনি

xargsলাইন কল echoবা করা উচিত নয় printf?
ওয়াইল্ডকার্ড

1
@ উইল্ডকার্ড: ডিফল্টরূপে xargsকলগুলি/bin/echo
থোর

1
বাহ, আমার কোনও ধারণা ছিল না! এটি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে । ধন্যবাদ!
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড: এতে ডেটা প্রেরণ করা সমস্যার কারণগুলির xargsবিকল্পগুলির মতো মনে হচ্ছে /bin/echo... আমি একটি সতর্কতা যুক্ত করেছি।
থোর

9
$ sed -E 's/\s+/\n/g' ip.txt | paste - -
a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

$ sed -E 's/\s+/\n/g' ip.txt | paste - - -
a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj

9

ওয়াইল্ডকার্ড ইঙ্গিত অনুসারে, এটি কেবল তখনই কাজ করবে যদি আপনার ফাইলটি সুন্দরভাবে ফর্ম্যাট করা থাকে তবে এতে কোনও বিশেষ অক্ষর নেই যা শেলটি গ্লোব হিসাবে ব্যাখ্যা করবে এবং আপনি ডিফল্ট শব্দ বিভাজনের নিয়ম নিয়ে খুশি। আপনার ফাইলগুলি সেই পরীক্ষাকে "পাস" করবে কিনা সে সম্পর্কে যদি কোনও প্রশ্ন থাকে তবে এই পদ্ধতির ব্যবহার করবেন না।

একটি সম্ভাবনা printfএটি পছন্দ করতে ব্যবহার করা হবে

printf '%s\t%s\n' $(cat your_file)

এটি সামগ্রীর সামগ্রীতে শব্দ বিভাজন your_fileকরবে এবং সেগুলি জুড়বে এবং এগুলির মধ্যে ট্যাবগুলি দিয়ে মুদ্রণ করবে। অতিরিক্ত কলামগুলি পেতে আপনি আরও %sফর্ম্যাট স্ট্রিং ব্যবহার করতে পারেন printf


1
কোনও বিশেষ অক্ষর নেই এমন ফাইলের উপর নির্ভর করে। উদাহরণস্বরূপ, যদি এটির কোনও সংক্ষিপ্তসার (*) আপনি খুব অপ্রত্যাশিত ফলাফল পাবেন।
ওয়াইল্ডকার্ড

4
perl -n0E 'say s/\s+/ ++$n % 4 ?"\t":"\n"/gre' file

(কলামের সংখ্যা দ্বারা 4 প্রতিস্থাপন)


4

BSD rs(পুনঃ আকার) ইউটিলিটি:

$ rs 0 2
a   aa  aaa     b   bb  bbb     c   cc  ccc
d   dd  ddd     e   ee  eee     f   ff  fff
g   gg  ggg     h   hh  hhh     i   ii  iii
j   jj  jjj
[Ctrl-D][Enter]
a    aa
aaa  b
bb   bbb
c    cc
ccc  d
dd   ddd
e    ee
eee  f
ff   fff
g    gg
ggg  h
hh   hhh
i    ii
iii  j
jj   jjj

0 2হয় সারি এবং কলাম । নির্দিষ্ট করার 0অর্থ "কলাম থেকে স্বয়ংক্রিয়ভাবে সারি গণনা করুন"।


3

পাইথন স্ক্রিপ্ট পদ্ধতির।

এখানে মূল ধারণাটি হ'ল আপনার পাঠ্যের সমস্ত শব্দকে একটি তালিকায় সমতল করা, এবং তারপরে প্রতিটি দ্বিতীয় আইটেমের পরে নতুন লাইনটি মুদ্রণ করা (এটি দুটি কলামে কলামিয়েট করার জন্য)। আপনি যদি 3 টি কলাম চান তবে এতে পরিবর্তন index%2করুনindex%3

#!/usr/bin/env python3
import sys

items = [i for l in sys.stdin 
           for i in l.strip().split()]
line = []
for index,item in enumerate(items,1):
    line.append(item)
    if index%2 == 0:
       print("\t".join(line))
       line = []

নমুনা আউটপুট:

$ python recolumnate.py < input.txt                                            
a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

থ্রি-কলামের সংস্করণ (উপরে যেমন বলা হয়েছে, কেবল index%3 == 0পরিবর্তিত হয়েছে)

$ cat recolumnate.py                                                           
#!/usr/bin/env python3
import sys

items = [i for l in sys.stdin 
           for i in l.strip().split()]
line = []
for index,item in enumerate(items,1):
    line.append(item)
    if index%3 == 0:
       print("\t".join(line))
       line = []

$ python recolumnate.py < input.txt                                            
a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.