কোনও ফাইলে দীর্ঘতম লাইন


198

আমি কোনও ফাইলের দীর্ঘতম লাইনের দৈর্ঘ্য সন্ধান করার জন্য একটি সহজ উপায় সন্ধান করছি। আদর্শভাবে, এটি কোনও স্ক্রিপ্টের পরিবর্তে একটি সাধারণ বাশ শেল কমান্ড হবে।

উত্তর:


270

ডাব্লুসিসি (জিএনইউ কোর্টিল) 7.4 ব্যবহার করে:

wc -L filename

দেয়:

101 filename

56
মনে রাখবেন যে কেবলমাত্র -c -l -m -wবিকল্পগুলি পসিক্স। -Lএকটি GNUism।
জেনস

4
এছাড়াও লক্ষ্য রাখবেন যে ফলাফলটি -Lলোকেলের উপর নির্ভর করে। কিছু চরিত্র (উভয় বাইট এবং মাল্টিবাইট অর্থে) এমনকি মোটেও গণনা করা যায় না!
ওয়াল্টার ট্রস

7
ওএস এক্স:wc: illegal option -- L usage: wc [-clmw] [file ...]
হুগো

12
ওএস এক্স: হোমব্রিউ ব্যবহার করে, জিএনইউ ওয়ার্ড কাউন্টের জন্য জিডব্লিউসি ব্যবহার করুন gwc -L ফাইলের নাম
কায়াকডার

3
@xaxxon gwcহয় coreutilsসূত্র, যা একটি সঙ্গে গনুহ coreutils সব ইনস্টল gউপসর্গ।
gsnedders

100
awk '{print length, $0}' Input_file |sort -nr|head -1

রেফারেন্সের জন্য: একটি ফাইলের মধ্যে দীর্ঘতম লাইন সন্ধান করা


12
অতিরিক্ত বিড়াল কমান্ড কেন? অ্যাজকে আর্গুমেন্ট হিসাবে কেবল ফাইলের নাম দিন।
টমাস প্যাড্রন-ম্যাকার্থি

18
@Thomas। এটি একটি পাইপের হিসাবে প্রকাশ করা বিকল্প হিসাবে কোনও ফাইল নির্দিষ্ট করার চেয়ে সাধারণ। আমার ক্ষেত্রে, আমি একটি ডাটাবেস কোয়েরি থেকে আউটপুট পাইপ ব্যবহার করব।
অ্যান্ড্রু প্রক

1
এটির সেরা উত্তর কারণ এটি আরও পসিক্স (ভাল, ওএস এক্সে কাজ করে)
এমকে।

5
@MK। যাইহোক, এই পদ্ধতির লাইনের সংখ্যার ক্ষেত্রে ও (এন * লগ (এন)) রয়েছে, তবে রামনের দৃষ্টিভঙ্গি হ'ল (এন)।
jub0bs

2
একটি বৃহত ফাইল বাছাইয়ে ইনপুট ফাইলের আকারের উপর নির্ভর করে গিগাবাইট, এমনকি টেরাবাইটের টেম্পের স্পেস সম্পূর্ণ করতে এবং গ্রাস করতে কয়েক ঘন্টা সময় নিতে পারে। দীর্ঘতম দৈর্ঘ্য এবং এর সাথে সম্পর্কিত রেকর্ড সংরক্ষণ করার কথা বিবেচনা করুন, তারপরে এটি কোনও END{}ব্লক থেকে মুদ্রণ করুন ।
Luv2code

67
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 

3
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
ke20

5
awk 'length>max{max=length}END{print max}' file
ক্রিস সিমুর

8
এই উত্তরটি দৈর্ঘ্যের পরিবর্তে ফাইলটির দীর্ঘতম লাইনের পাঠ্য দেয় । যদিও আমি প্রশ্নটি দৈর্ঘ্যের জন্য জিজ্ঞাসা করেছি তবুও আমি এটিকে রেখে দিচ্ছি কারণ আমার সন্দেহ হয় যে এই পৃষ্ঠায় আসা শিরোনামটির দিকে তাকানো লোকদের পক্ষে এটি কার্যকর হবে।
রমন

3
WC ব্যবহার করে গণনা পাওয়া সহজ ..awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
নিক

1
আপনি দয়া করে ব্যাখ্যা দিন যে এটি কীভাবে কাজ করে?
Lnux

23

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

#!/bin/sh

MAX=0 IFS=
while read -r line; do
  if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"

6
(বিড়ালের মাধ্যমে) স্ট্যান্ড ইন থেকে পড়তে না পারা আসলে এর ব্যবহারিকতা হ্রাস করে না, বাড়ায় না।
অ্যান্ড্রু প্রোক

4
ঠিক আছে, ওপি স্পষ্টভাবে "ফাইল" বলেছিল এবং এটি ছাড়াই < "$1"স্টিডিন থেকে সহজেই পড়তে পারে। $#এটির পরীক্ষার সাহায্যে আরগের সংখ্যা নির্ভর করে উভয়ই করতে পারে। এই বিশ্বে কেবল অকেজো বিড়ালের কোনও প্রয়োজন নেই। শুরু থেকেই ঠিক নতুন শিখিয়ে দেওয়া উচিত।
জেনস

7
এটি উচ্চতর রেটিং করা উচিত, এটি ব্যবহারকারী যা চেয়েছিলেন তা। দীর্ঘতম ফাংশন যুক্ত করুন () read MAX = 0 আইএফএস = পড়ার সময়-রেখা; যদি [$ {# লাইন} -gt $ MAX]; তারপরে MAX = $ {# লাইন}; আপনার .bashrc এ ফাই সম্পূর্ণ প্রতিধ্বনিত হয়েছে $ MAX run এবং আপনি চালাতে পারেনlongest < /usr/share/dict/words
স্কিরিপেজ


11
perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1

দীর্ঘতম রেখার দৈর্ঘ্য, রেখা নম্বর এবং সামগ্রী মুদ্রণ করে

perl -ne 'print length()."  line $.  $_"' myfile | sort -n

লাইন সংখ্যা এবং দৈর্ঘ্য সহ সমস্ত লাইনের একটি বাছাই করা তালিকা মুদ্রণ করে

.সংক্ষিপ্ত অপারেটর - এটি দৈর্ঘ্যের পরে এখানে ব্যবহৃত হয় ()
$.হ'ল বর্তমান লাইন সংখ্যাটি
$_বর্তমান লাইন


একটি ফাইল বাছাই করা প্রয়োজন .. মাঝারি আকারের ফাইলগুলির জন্য এমনকি কর্মক্ষমতা ভয়ঙ্কর হবে এবং বড় ফাইলগুলির জন্য কাজ করবে না। wc -Lআমি এখন পর্যন্ত দেখেছি সেরা সমাধান।
তাগর

উত্স হিসাবে (5 ব্রিটিশ ন্যাশনাল কর্পাস) 550MB 6,000,000 লাইনের পাঠ্য ফাইলটি ব্যবহার করে, পার্ল wc -L
দ্রবণটি

wc -Lকেবল সংখ্যার রেকর্ড গণনা করুন - এই কিউ দীর্ঘতম লাইনটি সন্ধান করতে চলেছিল - একেবারে একই নয়, সুতরাং এটি সঠিক তুলনা নয়।
তাগর

6

উপরের উদাহরণগুলিতে গুরুত্বপূর্ণ উপেক্ষিত পয়েন্ট

নিম্নলিখিত 2 টি উদাহরণ বর্ধিত ট্যাবগুলি গণনা করে

  wc -L  <"${SourceFile}" 
# or
  expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'

নিম্নলিখিত 2 টি বিহীন ট্যাবগুলি গণনা করুন।

  expand --tabs=1 "${SourceFile}" | wc -L 
# or
  awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"

সুতরাং

              Expanded    nonexpanded
$'nn\tnn'       10            5

5

সমস্ত উত্তর দেখে মনে হচ্ছে দীর্ঘতম লাইনের লাইন নম্বরটি দেবেন না। নিম্নলিখিত কমান্ড লাইন নম্বর এবং মোট দৈর্ঘ্য দিতে পারে:

$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11

আমরা শুরু করছি. এটি আমার সন্দেহজনকভাবে দীর্ঘ মন্তব্য খুঁজে পায়। ধন্যবাদ দোস্ত.
ফিলিপ

আপনি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে পারেন এবং বিড়ালটিকে নির্মূল করতে পারেন। awk '{print length}' test.txt | sort -rn | head -1। আপনার যদি সত্যিকারের লাইনের সামগ্রীরও প্রয়োজন হয়, তবে awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
কাকোমা

3

পার্ল ইন:

perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1

এটি কেবল লাইনটি প্রিন্ট করে, এর দৈর্ঘ্যও নয়।


3

এখানে অ্যানসারটির উল্লেখ রয়েছে

cat filename | awk '{print length, $0}'|sort -nr|head -1

http://wtanaka.com/node/7719


1
দ্বিতীয় সেকেন্ড স্ক্রিপ্টটি আপনাকে কেবল দীর্ঘতম দৈর্ঘ্য বলবে, দীর্ঘতম রেখাটি প্রদর্শন করবে না।
আরএসপি

1
আসুন..এটি উল্লেখের সাথে যুক্ত হওয়া প্রথম দুটি উত্তরের সমান।
প্যালে ব্লু ডট

@ আরএসপি: আমি দ্বিতীয় আনসারকে মেরে ফেলেছি
নাদির সাউলেলেম

2

কেবল মজা করার জন্য, এখানে পাওয়ারশেল সংস্করণটি রয়েছে:

cat filename.txt | sort length | select -last 1

এবং মাত্র দৈর্ঘ্য পেতে:

(cat filename.txt | sort length | select -last 1).Length

4
এমনকি পাওয়ারশেল প্রোগ্রামারদের অবশ্যই অকেজো বিড়াল ব্যবহার করা উচিত?
জেনস

1
@ জেনস নিশ্চিত নয় যে আমি আপনাকে বুঝতে পেরেছি, পাওয়ারশেলের বিড়াল গেট-কন্টেন্টের জন্য কেবলমাত্র একটি উপনাম, যার আচরণ প্রসঙ্গ এবং সরবরাহকারীর উপর নির্ভর করে।
এডিগ্রোভস

sortআর্গুমেন্ট হিসাবে filename.txt নিতে পারেন ? তারপরে বিড়ালটি অকেজো হয় কারণ sort length filename.txt | select -last 1একটি পাইপ এবং এমন একটি প্রক্রিয়া এড়িয়ে যায় যা কেবল চারপাশের ডেটা অনুলিপি করে।
জেনস

সাইডেনোট হিসাবে পাওয়ারশেল ঠিক কী? আমি ভেবেছিলাম উইন্ডোজ মেশিনের জন্য পাওয়ারশেল ইউটিলিটি ব্যবহার করা হয়েছিল?
খোলামেলা

4
@ জেনস, ডেটা ফাইলের পরিবর্তে স্ট্রিম থেকে প্রায়শই আসে। এটি একটি স্ট্যান্ডার্ড ইউনিক্স সরঞ্জাম আইডিয়াম।
অ্যান্ড্রু প্রক

2

আমি একটি ইউনিক্স পরিবেশে আছি এবং কয়েক জিবি আকারের জিজেপড ফাইলগুলির সাথে কাজ করছি। আমি 2052 রেকর্ড দৈর্ঘ্যের 2 জিবি গিজিপযুক্ত ফাইল ব্যবহার করে নিম্নলিখিত কমান্ডগুলি পরীক্ষা করেছি।

  1. zcat <gzipped file> | wc -L

এবং

  1. zcat <gzipped file> | awk '{print length}' | sort -u

সময়গুলি অ্যাভারেজে ছিল

  1. 117 সেকেন্ড

  2. 109 সেকেন্ড

এখানে প্রায় 10 রানের পরে আমার স্ক্রিপ্ট।

START=$(date +%s) ## time of start

zcat $1 |  wc -L

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

START=$(date +%s) ## time of start

zcat $1 |  awk '{print length}' | sort -u

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

আমি নিশ্চিত নই যে এটি একটি বৈধ তুলনা, আমি উদ্বিগ্ন হব যে awkসংস্করণটি wcপ্রথমে চলমান সংস্করণটির ডিস্ক ব্লক ক্যাশে করার ফলে (এবং ডিস্ক ক্যাশে বীজ দেয়) benefits এই তর্কটি আটকে দেওয়ার জন্য আপনাকে দশ রানের মধ্যে কে প্রথমে ডেকে আনে তার ক্রমটি এলোমেলো করতে হবে।
ক্যানোনিকাল ক্রিস

1

থিমের উপর পার্থক্য।

এইটি ফাইলটিতে সর্বাধিক দীর্ঘতম লাইনের দৈর্ঘ্যযুক্ত সমস্ত রেখাগুলি প্রদর্শিত হবে, উত্সে প্রদর্শিত ক্রমটি ধরে রাখবে।

FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE

তাই মাইফিল

x
mn
xyz
123
abc

দিতে হবে

xyz
123
abc

0

আপনি যদি ম্যাকওএস ব্যবহার করে থাকেন এবং এই ত্রুটিটি পেয়ে থাকেন: wc: illegal option -- Lআপনাকে জিএনইউ চূড়ান্তভাবে এটি ইনস্টল করতে হবে না।

আপনি যা করতে চান তা যদি কেবলমাত্র ফাইলের দীর্ঘতম লাইনের অক্ষরের গণনা পাওয়া যায় এবং আপনি ওএস এক্স রান ব্যবহার করছেন:

awk '{print length}' "$file_name" | sort -rn | head -1

এটার মতো কিছু;

echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"

আউটপুট:

The longest line in the file my_file has 117 characters

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