কিভাবে একটি ফাইল থেকে দীর্ঘতম লাইন পেতে?


10

আমি কোনও ফাইল থেকে দীর্ঘতম লাইনের লাইন নম্বরটি জানতে আগ্রহী।

উদাহরণস্বরূপ, নিম্নলিখিত লিখিত সামগ্রী সহ আমার কাছে যদি একটি ফাইল থাকে:

lalala
tatatata
abracadabra
mu mu mu

আমি একটি ব্যাশ স্ক্রিপ্ট আমাকে এভাবে একটি আউটপুট কিছু দেব যে কিভাবে লিখতে পারেন: 3 -> abracadabra?

উত্তর:


9

এটি করার জন্য আপনার কোনও স্ক্রিপ্টের দরকার নেই। একটি সাধারণ কমান্ড যথেষ্ট:

egrep -n "^.{$(wc -L < filename)}$" filename

আপনার একই সর্বোচ্চ দৈর্ঘ্যের দুটি বা ততোধিক লাইন থাকলেও এটি কাজ করবে।

আপনি যদি চান যে আউটপুটটি এই ফর্মটিতে হ'ল: 3 -> abracadabraতবে ব্যবহার করুন:

egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'

তথ্যসূত্র:


3
@ don.joey: এটি ইউনিক্সের শক্তি। সাধারণ কমান্ড, যা একসাথে কাজ করতে পারে। এখানে তিনি "^। {n} $" সন্ধান করেন, অর্থাত কোনও রেখা যা লাইন ( ^) এর প্রারম্ভের শেষে এবং এর শেষের ( $) এর মধ্যে ঠিক n অক্ষর ( .{n}) রয়েছে। তারপরে তার কেবল এনটি সন্ধান করতে হবে: এর জন্য তিনি একটি জিএনইউ-ইস্ম, "ডাব্লুসি-এল ফাইলনাম" ব্যবহার করুন (নোট করুন এটি পজিক্স নয়) যা ফাইলনামের দীর্ঘতম লাইনের দৈর্ঘ্য প্রদান করে। সুতরাং তিনি দীর্ঘতম দৈর্ঘ্যের যে কোনও লাইনকে গ্রেপ করেন। $(cmd)এর আউটপুট দ্বারা প্রতিস্থাপিত হয় cmd
অলিভিয়ার ডুলাক

1
অলিভিয়েরডুলাক দুর্দান্ত মন্তব্য।
রাদু রেদেনু

আরও ভাল, আপনি -C 3প্রেক্ষাপটের আগে এবং পরে কয়েকটি লাইন পেতে
গ্রেপ

8

আপনি ব্যবহার করতে পারে awkএকে লাইন (দৈর্ঘ্য প্রিন্ট করতে length()) এবং লাইন নম্বর ( NR), তারপর (বিপরীত -r) sortসংখ্যা দ্বারা ফলাফল ( -n):

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala

প্রথম লাইনটি দেখানোর জন্য:

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr

@ ব্যবহারকারী214965 দয়া করে আমার আপডেটটি দেখুন, প্রদর্শিত লাইন নম্বরটি ফলাফলের দ্বিতীয় নম্বর।
আটটিলা ও

যদি একই সর্বোচ্চ দৈর্ঘ্য সহ 2 টি লাইন থাকে?
রাদু রেডানু

@ RaduRădeanu ভাল পয়েন্ট। +1 এর জন্য wc -L, আমি সেই যুক্তি সম্পর্কে জানতাম না। এটি প্রকৃতপক্ষে খুব দরকারী।
আটটিলা ও।

4

পার্ল ওয়ান লাইনারের সাহায্যে এও (এন) অর্জন করা যায়:

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

ব্যবহারসমূহ (যেখানে মেশিন একটি ফাইলের নাম)

cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

অথবা

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin

বা (কম পরিষ্কার তবে খাটো)

perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin

অনেক বেশি দক্ষ। ধন্যবাদ! এটি খুঁজছিল।
টেস্ট 30

1
বিশাল ফাইল +1
h3xস্ট্রিম

0

ও (এন) মেশিনগুলির জন্য, উদাহরণস্বরূপ ওপেনডব্লিউআরটি, যেখানে পার্ল উপলব্ধ নেই, @ awk @ সংস্করণটি কার্যকর হতে পারে।

awk 'length > l {l=length;line=$0} END {print line}' FILE

বা অজগর:

python -c "print max(open('$file', 'r'), key=len)"

0

রাদুর উত্তর পুরোপুরি যথেষ্ট এবং পছন্দসই, যদিও আপনি আরও স্পষ্ট এবং শেল-ভিত্তিক সমাধান চান, তবে আপনি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে পারেন:

#!/bin/bash
longest_length=0
longest_string=0
while IFS= read -r line || [ -n "${line}"]
do
    if [ "${#line}" -gt "${longest_length}" ]
    then
        longest_length="${#line}"
        longest_string="$line"
    fi
done < "$1"

echo "${longest_string}"

ব্যবহার: ./find_longest.sh input.txt

উদাহরণ:

$ cat input.txt                                                          
1 2 
2 3 a a a a
4 5 6 
1 1 1 5

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