পাঠ্য প্রক্রিয়াজাতকরণ - প্রতি দুটি লাইনে কমা দিয়ে যোগ দিন


35

আমার একটি ফাইলে 1000 টিরও বেশি লাইন রয়েছে। ফাইলটি নিম্নলিখিতভাবে শুরু হয় (লাইন সংখ্যা যুক্ত হয়েছে):

Station Name
Station Code
A N DEV NAGAR
ACND
ABHAIPUR
AHA
ABOHAR
ABS
ABU ROAD
ABR

আমাকে প্রতি দুটি লাইনে যোগ দিয়ে কমা বিচ্ছিন্ন এন্ট্রি সহ এটি একটি ফাইলে রূপান্তর করা দরকার। চূড়ান্ত তথ্য দেখতে হবে

Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
...

আমি যা চেষ্টা করছিলাম তা হ'ল - একটি শেল স্ক্রিপ্ট লেখার চেষ্টা করা হয়েছিল এবং তারপরে echoতাদের মাঝে কমা দিয়ে। তবে আমার ধারণা, একটি সহজ কার্যকর ওয়ান-লাইনার এখানে কাজটি করতে পারে sed/awk

কোন ধারনা?


@ l0b0 আপনি ওপি'র মন্তব্যটি সম্পাদনা করেছেন যে লাইন নম্বরগুলি "কেবলমাত্র ব্যাখ্যা করার জন্য সেখানে" ...
জেসনওয়ারিয়ান

@ জেসনওয়ারিয়ান দুঃখিত, আমি ভেবেছিলাম লাইনগুলি ব্যাখ্যার জন্য রয়েছে। 0 লাইনে পার্স ত্রুটি
l0b0

উত্তর:


39

কেবলমাত্র cat(যদি আপনি বিড়ালদের পছন্দ করেন ;-)) এবং paste:

cat file.in | paste -d, - - > file.out

ব্যাখ্যা: pasteবেশ কয়েকটি ফাইল থেকে পড়া এবং সংশ্লিষ্ট লাইনগুলি একসাথে আটকানো (দ্বিতীয় ফাইলের লাইন 1 সহ প্রথম ফাইলের লাইন 1):

paste file1 file2 ...

ফাইলের নামের পরিবর্তে আমরা -(ড্যাশ) ব্যবহার করতে পারি । pasteফাইল 1 (যা স্টিডিন) থেকে প্রথম লাইন নেয়। তারপরে, এটি ফাইল 2 থেকে প্রথম লাইনটি পড়তে চায় (এটি স্ট্যান্ডিনও)। তবে যেহেতু স্টিডিনের প্রথম লাইনটি ইতিমধ্যে পড়া এবং প্রক্রিয়াজাত করা হয়েছিল, এখন ইনপুট স্ট্রিমের জন্য অপেক্ষা করা হচ্ছে স্টিডিনের দ্বিতীয় লাইন, যা pasteখুশিতে প্রথমটিতে প্রবেশ করেছে। -dবিকল্প বিভেদক একটি ট্যাব একটি কমা বদলে হতে সেট করে।

বিকল্পভাবে, না

cat file.in | sed "N;s/\n/,/" > file.out

পিএস হ্যাঁ, উপরেরটি কেউ সহজ করতে পারেন

< file.in sed "N;s/\n/,/" > file.out

অথবা

< file.in paste -d, - - > file.out

যার ব্যবহার না করার সুবিধা রয়েছে cat

যাইহোক, আমি এই প্রতিমাটি উদ্দেশ্য হিসাবে ব্যবহার করি নি , স্পষ্টতার কারণে - এটি কম ভার্বোস এবং আমি পছন্দ করি cat(ক্যাটস আর নিস)। সুতরাং দয়া করে সম্পাদনা করবেন না।

বিকল্পভাবে, আপনি যদি বিড়ালদের কাছে পেস্ট পছন্দ করেন (পেস্ট হ'ল অনুভূমিকভাবে ফাইলগুলি সংশ্লেষ করার আদেশ, তবে বিড়ালটি উল্লম্বভাবে তাদেরকে সম্মিলিত করে) আপনি ব্যবহার করতে পারেন:

paste file.in | paste -d, - -

শুধু আবার উল্লেখ করার জন্য। লাইন নম্বরগুলি ফাইলের একটি অংশ নয় :)
mtk

paste কমান্ড পুরোপুরি কাজ করে, আপনি এটি সম্পর্কে একটু বেশি ব্যাখ্যা দিন পারবেন না। হাইফেনস ???
mtk

2
হাইফেনগুলির অর্থ "স্টিডিন থেকে পড়া"। যদি একই ইনপুট উত্সটি পুনরাবৃত্তি করা হয় তবে আউটপুটের সারিতে প্রতিবার কয়েকবার পড়তে জানে পেস্ট।
সন্দেহভাজন জিম

@ এসসিএইচ: শীতল সম্পাদনা, আমি এটিটি স্পর্শ করব না :-)

1
আপনার catযুক্তি সম্মানের সাথে । না sed "N;s/\n/,/" file.in > file.outকাজ না?
বার্নহার্ড

8

যদি কেউ এখানে অবতরণ করে তবে সমস্ত লাইন একটি সিএসভি ওয়ান লাইনারে একত্রিত করার চেষ্টা করছে, চেষ্টা করুন

cat file | tr '\n' ','

3
sed 'N;s/\n/,/' file

সেড ব্যবহার করে প্রতি 2 লাইনে যোগ দিন (এন) যোগ করুন এবং "," দিয়ে নতুন লাইন (\ n) প্রতিস্থাপন করুন।


3
paste -sd ',\n' file.in > file.out

এছাড়াও নোট করুন যেহেতু আমরা কেবল একটি চরিত্রের সাথে অন্য একটি প্রতিস্থাপন করেছি (কমা দিয়ে প্রতিটি অন্যান্য নতুন লাইন), আমরা জায়গায় ইনপুট ফাইলটিতে কাজ করতে পারি:

paste -sd ',\n' file.in 1<> file.in

(তবে সাবধান যে এটি সিএনআরএলএফ টার্মিনেটর (মাইক্রোসফ্টের মতো )যুক্ত নন-ইউনিক্স সিস্টেমে কাজ নাও করতে পারে যা কিছু এমুলেটেড পোসিক্স pasteনন-ইউনিক্স পদ্ধতিতে আচরণ করতে পারে)


কি যে আছে 1এখানে করছে 1<>? এটা কি টাইপো?
সিস

@ αғsнιη দেখুন এই
Iruvar

@iruvar আপনাকে ধন্যবাদ
9:34

2

খাঁটি বাশ ব্যবহার করে এখানে একটি ওয়ান-লাইনার (যদিও সম্ভাব্য লক্ষ লক্ষ-কমান্ড-রান-এর) রয়েছে:

(IFS=; while read -r name; do read -r code; printf '%s\n" "$name,$code"; done < file.in) > file.out

আমি একটি সাবশেল (প্যারানথেসিস) ব্যবহার করি যাতে আমাকে সঞ্চয় এবং পুনরুদ্ধার করতে না হয় IFS। উত্স উত্সাহিত হলে ব্যবহারকারীদের পরিবেশকে গোলমেলে না ফেলে কোনটি করা উচিত। বিকল্পটি কেবলমাত্র সেই readহিসাবে নতুন আইএফএস পাস করা হবে IFS= read -r name,IFS= read -r code

লুপের সমস্ত কমান্ড শেলটিতে নির্মিত তা এই কার্যকারিতাটিকে গ্রহণযোগ্য করে তোলে এবং ছোট ফাইলগুলির জন্য অন্যান্য সমাধানগুলির চেয়ে আরও দ্রুত। তবে অনেক লোক এটিকে খারাপ অনুশীলন হিসাবে বিবেচনা করবে এবং এটিকে অন্য যে কোনও কিছুতে সাধারণীকরণের সময় সাবধান হওয়া উচিত।


পরিবেশগত পরিবর্তনের স্থানীয়করণের জন্য সাব-শেলগুলি ব্যবহার করার জন্য সাধারণ হাঁ। তবে এক্ষেত্রে এটির দরকার নেই: আপনি এর পরিবর্তে এটি করতে পারেন while IFS='\n' read -r name; do IFS='\n' read -r code ... done < file.inযা একটি শব্দের মত যা আমি প্রায়শই শেল স্ক্রিপ্টগুলিতে দেখি। -rপতাকা readমানে হলো "চরিত্র '\' দুই অক্ষর, বরং একটি newline যেমন চেয়ে যেমন stdin প্রবাহে চরিত্র 'এন' দ্বারা অনুসরণ ব্যাখ্যা।" যুক্তিযুক্তভাবে, সাব-শেলটি তৈরির জন্য আপনি এটির পুনরাবৃত্তি করার চেয়ে আরও নান্দনিক হতে পারেন IFS='\n'
dubiousjim

@ দুবাইজিজিম: -rসমাধানটি প্রযুক্তিগতভাবে উন্নত হয়েছে। গ্রেট! আমি IFSদুবার পরিবর্তিত পাস করার ধারণার ভক্ত নই । আমি যদি একটি পঠন ব্যবহার করি তবে খুব ভাল, তবে দু'বার নয়। অবশ্যই এটি মতামত একটি বিষয় । আমি বলব যে সাধারণ বাশ জ্ঞানের উপর একটি সাবশেল ব্যবহার করা কিছুটা সামান্য, তাই অনেক লোককে এর উদ্দেশ্য বুঝতে সমস্যা হবে। এটি একটি খারাপ জিনিস।
মুছে ফেলা হয়েছে

2

উত্তরগুলির সম্পূর্ণ সেটের জন্য, একটি সম্ভাব্য awkসমাধান হতে পারে:

awk 'NR%2==1 {printf $0","} NR%2==0 { print $0}' *file*

@ ডাউনভোটার: ডাউনটাটের প্রাপ্য হওয়ার জন্য আমার উত্তরটিতে কী ভুল? এটা কিভাবে উন্নত করা যায়?
বার্নহার্ড

অলসতার কারণে printf? বিরল ক্ষেত্রে ব্যর্থ হবে যখন কোনও স্টেশনের নামটিতে একটি ফর্ম্যাট নির্দিষ্টকারক থাকে। ( একটি উদাহরণের জন্য পেস্টবিন .com/wgxFttrJ দেখুন )) তবে এটি কেবল অনুমান, ডাউনভোটটি আমার কাছ থেকে আসে না।
manatwork

1

একটি এর বার্ধক্য পুরাতন বাদামী awkবাগ্ধারা

awk '{ORS=NR%2?",":"\n";print}' file
Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR

awk '{ORS=NR%2?",":"\n"};1'সংক্ষিপ্ত এবং আরও
বুদ্ধিমান

@ কুওগলম, আমি সন্দেহ করি। এই দৃষ্টান্তে এটি এখনও একটি ওয়ান-লাইনার printএবং উদ্দেশ্যটি স্পষ্ট হওয়া সত্ত্বেও । আমার মতো 1পুরানো awkহাতের কাছে ঠিক তেমন স্পষ্ট তবে আমি পছন্দ করিprint
ইরুভার

এটিই ছিল প্রথম সহজ সমাধান যা আমি 2 টিরও বেশি লাইনে সহজেই কনফিগারযোগ্য। sedঅনুসন্ধানের আগে আমি কিছু সময়ের জন্য লড়াই করেছি , তবে awkপ্রতি 4 টি লাইন একত্রিত করা সহজ করে তুলেছি। আমাকে একটি ট্রিপ সংরক্ষণ $EDITOR!
অপেলো


0

উদাহরণ স্বরূপ:

seq 0 70 | xargs -L 2 | sed 's/ /,/g'

আউটপুট: (দ্রষ্টব্য: xargs -L number_of_columnsবেশিরভাগ সংখ্যক কলামের সাথে প্রতিটি দুটি লাইনেই ভাল কাজ করে না)

0,1
2,3
4,5
6,7
8,9
10,11
12,13
14,15
16,17
18,19
20,21
22,23
24,25
26,27
28,29
30,31
32,33
34,35
36,37
38,39
40,41
42,43
44,45
46,47
48,49
50,51
52,53
54,55
56,57
58,59
60,61
62,63
64,65
66,67
68,69
70

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