ファイルから最も長い行の行番号を知りたいです。
たとえば、次の内容のファイルがあるとします。
lalala
tatatata
abracadabra
mu mu mu
次のような出力が得られるbashスクリプトを作成するにはどうすればよい3 -> abracadabra
ですか。
ファイルから最も長い行の行番号を知りたいです。
たとえば、次の内容のファイルがあるとします。
lalala
tatatata
abracadabra
mu mu mu
次のような出力が得られるbashスクリプトを作成するにはどうすればよい3 -> abracadabra
ですか。
回答:
これを行うためのスクリプトは必要ありません。簡単なコマンドで十分です:
egrep -n "^.{$(wc -L < filename)}$" filename
これは、同じ最大長の行が2つ以上ある場合でも機能します。
出力をこの形式に正確にしたい場合は3 -> abracadabra
、次のようにします。
egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'
参照:
-C 3
grepオプションに追加して、前後数行のコンテキストを取得することもできます
あなたは使用することができ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
wc -L
その議論については知りませんでした。とても便利です。
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
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
^
)と行末()の間の$
文字がちょうどn文字(.{n}
)の行を探します。次に、nを見つける必要があります。これには、ファイル名の最も長い行の長さを返すGNU-ism、「wc -L filename」(これはposixではないことに注意)を使用します。そのため、彼は最長の線をすべて掴みます。$(cmd)
の出力に置き換えられますcmd
。