ファイルから最長の行を取得する方法は?


10

ファイルから最も長い行の行番号を知りたいです。

たとえば、次の内容のファイルがあるとします。

lalala
tatatata
abracadabra
mu mu mu

次のような出力が得られるbashスクリプトを作成するにはどうすればよい3 -> abracadabraですか。

回答:


9

これを行うためのスクリプトは必要ありません。簡単なコマンドで十分です:

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

これは、同じ最大長の行が2つ以上ある場合でも機能します。

出力をこの形式に正確にしたい場合は3 -> abracadabra、次のようにします。

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

参照:


3
@ don.joey:それがUNIXの力です。一緒に動作できる単純なコマンド。ここでは、「^。{n} $」、つまり行頭(^)と行末()の間の$文字がちょうどn文字(.{n})の行を探します。次に、nを見つける必要があります。これには、ファイル名の最も長い行の長さを返すGNU-ism、「wc -L filename」(これはposixではないことに注意)を使用します。そのため、彼は最長の線をすべて掴みます。$(cmd)の出力に置き換えられますcmd
Olivier Dulac 2013年

1
@OlivierDulac素晴らしいコメント。
RaduRădeanu2013年

さらに良いことに、(たとえば)-C 3grepオプションに追加して、前後数行のコンテキストを取得することもできます
ShadSterling

8

あなたは使用することができawk、各ライン(の長さ印刷するlength())と行番号(NR)、その後、(逆-rsort(数によって結果を-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

@ user214965更新をご覧ください。表示される行番号は、結果の2番目の番号です。
Attila O.

同じ最大長の2行がある場合はどうなりますか?
RaduRădeanu2013年

@RaduRădeanu良い点。の+1、wc -Lその議論については知りませんでした。とても便利です。
Attila O.

4

AO(N)はperl one linerで実現できます:

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

使用法(ここでmachinはファイル名です)

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

はるかに効率的です。ありがとう!探していました。
test30

1
巨大なファイル+1で
動作し

0

O(n)たとえば、Perlが使用できないOpenWRTなどのマシンでは、@ awk @バージョンが役立つ場合があります。

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

またはpython:

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

0

Raduの答えは完全に十分であり、好まれますが、より明示的でシェルベースのソリューションが必要な場合は、次のスクリプトを使用できます。

#!/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.