সারি থেকে কলামে কীভাবে রূপান্তর করবেন?


11

আমার কাছে একটি অনুরূপ সংখ্যার সাথে টেক্সট ফাইল রয়েছে (একই সারিতে):

106849_01373    106849_01967    106850_00082    23025.7_01059   

আমি তাদের এ জাতীয় রূপান্তর করতে চাই:

106849_01373
106849_01967
106850_00082
23025.7_01059

কোন আদেশটি ব্যবহার করব তা আমার কোনও ধারণা নেই। কেউ আমাকে এই সাহায্য করতে পারেন?

উত্তর:


5

এখানে একটি সঙ্গে xargs

xargs -n1 < file.txt

ডেমো:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs একটি দুর্দান্ত সরঞ্জাম, এবং আপনি যদি এটি উল্লেখ না করে থাকেন তবে আমার কাছে এটি ছিল তবে এটির একটি অসুবিধা আছে যা আপনি যদি কমান্ডটি বাদ দেন তবে এটি প্রতিধ্বনিকে প্রতিস্থাপন করে (যা কিছু শেলের মতো নয়, xargs এর কোনও বিল্টিন প্রতিধ্বনি থাকে না) এবং -n1 xargs কে প্রতিটি আরগের জন্য কমান্ড কল করতে বলে, সুতরাং এই উদাহরণের সাথে আপনার ন্যূনতম ছয়টি প্রসেস অন্তর্ভুক্ত থাকতে হবে (io পুনঃনির্দেশটি করার শেল, xargs এবং চারটি প্রতিধ্বনি)। এটি এই সুযোগে খুব খারাপ নয়, তবে কয়েক হাজার লাইনের আউটপুট এটি মাপতে ধীর হয়।
হালকা

16

এর সাথে খুব সহজ tr:

tr -s '[:blank:]' '\n' <file.txt

উদাহরণ:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

হিমাইলের উত্তর হ'ল উপায়, তবে এখানে পার্ল ব্যবহারের বিকল্প রয়েছে:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: স্বয়ংক্রিয় লাইন-এন্ডিং প্রসেসিং সক্ষম করে। এর দুটি পৃথক প্রভাব রয়েছে। প্রথমে, -n বা -p ব্যবহার করার পরে এটি স্বয়ংক্রিয়ভাবে ps / (ইনপুট রেকর্ড বিভাজক) চম্পস করে। দ্বিতীয়ত, এটি t \ (আউটপুট রেকর্ড বিভাজক )কে অক্টনামের মান রাখার জন্য নির্ধারিত করে যাতে কোনও মুদ্রণ বিবরণীতে সেই বিভাজকটিকে আবার যুক্ত করা যায়। যদি অক্টনাম বাদ দেওয়া হয় তবে $ \ কে বর্তমান মান $ / সেট করে।
  • -a: যখন -n বা -p ব্যবহার করা হয় তখন অটোস্প্লিট মোড চালু করে। @F অ্যারেতে একটি অন্তর্নিহিত স্প্লিট কমান্ডটি অন্তর্নিহিত অভ্যন্তরের মধ্যে প্রথম জিনিস হিসাবে সম্পন্ন করা হয় যখন -n বা -p দ্বারা উত্পাদিত লুপ হয়।
  • -n: পার্লকে আপনার প্রোগ্রামের চারপাশে নিম্নলিখিত লুপটি ধরে নিয়েছে, যা এটি ফাইল-নাম যুক্তিগুলিকে কিছুটা সেড-এন বা অ্যাজকের মাধ্যমে পুনরাবৃত্তি করে তোলে:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: প্রোগ্রামের এক লাইনে প্রবেশের জন্য ব্যবহার করা যেতে পারে;

  • $,="\n": আউটপুট ফিল্ড বিভাজককে একটি নতুন লাইনে সেট করে;
  • print(@F): আউটপুট ক্ষেত্র বিভাজক দ্বারা পৃথক ক্ষেত্রগুলি মুদ্রণ করে।
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKকাছে। মূলত ক্ষেত্রগুলির জন্য আউটপুট বিভাজক এবং লুপিং পরিবর্তন করা। পরীক্ষার ফাইলটি আপনার উদাহরণটি শেষের দিকে ENDLINE এর সাথে পেস্ট করা হয়

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

ব্যবহার sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

মোটামুটি নয় ... এটি প্রতিটি (প্রাথমিক) লাইনের পরে একটি ট্রেলিং করা নতুন লাইন যুক্ত করবে ..
হিমাইল

একাধিক লাইন পরীক্ষা করে দেখুন, আপনি তখন একটি পরিষ্কার কেস পাবেন ..
হিমাইল

আপনি কি আপনার উত্তরের সাথে একটি উদাহরণ যোগ করতে পারেন ..
হিমাইল

@ হেইমাইল আপনার অর্থ হ'ল এটি চলমান স্থানগুলিকে নতুন লাইনে পরিণত করবে। আপনার বাক্য গঠনটি বোঝা সহজ করে না। : /
টেকারফ

1

আমি মজাদার জন্য কেবল একটি পাইথন সমাধান যুক্ত করেছি:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

এই কমান্ডটি শেষ পর্যন্ত আর্গুমেন্ট হিসাবে রূপান্তর করতে চান সেই ফাইল নাম সহ 'একক উদ্ধৃতি' তে এক-লাইন পাইথন 3 স্ক্রিপ্টটি চালায়। বাক্য গঠনটি এরকম:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

আমরা যে 1-লাইন-লিপিটি ব্যবহার করি তা হ'ল (স্বচ্ছতার জন্য একাধিক লাইনে প্রসারিত):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

এটি sysকমান্ড-লাইন আর্গুমেন্টগুলি পড়ার জন্য মডিউলটি আমদানি করে , ফাইলের নাম হিসাবে খোলার জন্য প্রথম প্রদত্ত যুক্তিটি গ্রহণ করে এবং প্রতিটি শ্বেতস্পেস পৃথক করা ডেটা অংশটিকে একক লাইনে মুদ্রণ করে।

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.