ফাইলের কলাম রূপান্তর করতে সারি


15

ধরুন আমার কাছে একটি ফাইল রয়েছে:

file1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

ফাইল 2 আমি চাই:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

ফাইল 1-এর কলাম রূপান্তর করতে সারি।


যদি আপনার ফাইলটিতে একাধিক লাইন থাকে এবং আপনার আউটপুটটিতে একাধিক কলাম থাকতে পারে, তবে এই AWK স্ক্রিপ্টটি ব্যবহার করে দেখুন
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

খুব সংশ্লিষ্ট প্রশ্ন: askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

উত্তর:


20

ব্যবহার tr, প্রতিটি পুনরাবৃত্তি স্থান অক্ষর (প্রতিস্থাপন ) একটা একক নতুন লাইন (সঙ্গে \n) অক্ষর।

tr -s ' '  '\n'< infile > outfile

তবে আমার মনে হয় আপনি এরকম কিছু চান?

1 2 3 4 1 এ #
abcd -> 2 বি $
# $ @% 3 সি @
                4 ডি%

awkআমরা করতে পারে সঙ্গে :

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } 
    END{ for (i in RtoC) print RtoC[i] }' infile

এটি প্রতিটি একই ফাইল করা নম্বর পজিটোনকে এক সাথে যুক্ত করে এবং ENDফলাফলটি মুদ্রণ করে যা প্রথম কলামে প্রথম সারিতে হবে, দ্বিতীয় সারিতে দ্বিতীয় কলামে থাকবে ইত্যাদি etc. অবশ্যই ইনপুট ফাইলটি আপনার স্মৃতি আকারের মধ্যে সীমাবদ্ধ।


আমি একই ডেটা এবং কোড দিয়ে চেষ্টা করেছি, এটি সর্বশেষ কলামটি প্রথম রেকর্ড হিসাবে 4 ডি% এবং তারপরে দ্বিতীয় রেকর্ড 1 এ # ইত্যাদি প্রিন্ট করেছে।
অভিনেণ

8

আপনি কেবল গ্রেপের মাধ্যমে এটি করতে পারেন। ডিফল্ট গ্রেপ দ্বারা, ম্যাচটি একটি পৃথক নতুন লাইনে মুদ্রণ করবে।

grep -oP '\S+' infile > outfile

অথবা

grep -o '[^[:space:]]\+' infile > outfile

1
এর সৃজনশীল ব্যবহারের জন্য +1grep
ভোলকার সিগেল

8

আপনি fmtকমান্ডটি ব্যবহার করতে পারেন :

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

7

সঙ্গে গনুহ datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

datamashএই টাস্কটির সেরা হাতিয়ার হিসাবে মনে হচ্ছে, তবে আরও কতগুলি সরঞ্জাম ব্যবহার করা যেতে পারে তা আকর্ষণীয়!
মার্ক স্টুয়ার্ট

6

আপনি এটি ব্যবহার করে এটি করতে পারেন sed:

$ sed -e 's/  */\n/g' file1 > file2

দ্রষ্টব্য: শব্দের মধ্যে স্পেস রয়েছে এমন পরিস্থিতিটি পরিচালনা করে না।


এর জন্য জিএনইউ সিড প্রয়োজন, যতটা ভাল আমি বলতে পারি। ম্যাক (বিএসডি) দিয়ে যে জাহাজটি \n
পাঠানো হয় সেটিকে

5

ব্যবহার awk, আউটপুট ক্ষেত্র বিভাজক (সেটিং OFSরেকর্ড হিসাবে) (লাইন) বিভাজক ( RS):

awk '{OFS=RS;$1=$1}1' file > file2


0

আপনি ব্যবহার করার চেষ্টা করতে পারেন sed

$ sed -i.bak s@' '@'\n'@g infile.txt

দয়া করে নোট করুন যে আমি @বিকল্প ব্যবস্থার জন্য বিভাজক হিসাবে ব্যবহার করছি । এটি একটি ব্যাকআপ ফাইলও তৈরি করবে। আপনি যদি .bak একটি ব্যাকআপ সরানোর প্রয়োজন হয় না

$ sed -i s@' '@'\n'@g infile.txt

0

পাইথন সংস্করণ:

python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt

এটি <পাইথনের স্টিডিন থেকে পুনর্নির্দেশটি ব্যবহার করে এবং পুনঃনির্দেশগুলি ব্যবহার করে input.txtলেখেন । ওয়ান-লাইনার নিজেই সমস্ত লাইনে স্ট্রিংগুলির তালিকার মধ্যে পড়ে, যেখানে সমস্ত স্পেসগুলি নতুন লাইনের সাথে প্রতিস্থাপন করা হয় এবং আমরা ফাংশনটি ব্যবহার করে পুরো পাঠ্য পুনর্নির্মাণ করি ।output.txt>stdin.join()

সিরিজের একাধিক স্পেসগুলি নতুন .split()লাইনের সাথে প্রতিস্থাপন করা এড়াতে বিকল্প পদ্ধতির শব্দের তালিকার লাইনটি ভাঙ্গতে ব্যবহার করা। এইভাবে, আমরা নিশ্চিত করতে পারি যে প্রতিটি শব্দ কেবল একটি নতুন লাইন দ্বারা পৃথক করা হয়েছে

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt

0

ব্যবহার xargs, ( সৌরভকের উত্তর থেকে চুরি ):

xargs -n 1 < File1 > File2

অথবা যদি কোনও ছোটখাটো পুনরায় printfফর্ম্যাটিংয়ের প্রয়োজন হয় তবে ফর্ম্যাট স্ট্রিংগুলি যেমন প্রয়োজন তেমন ব্যবহার করুন :

xargs printf '%s\n' < File1 > File2


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.