ディレクトリ内のすべてのテキストファイルで最も長い行の長さを見つける


16

私はテキストファイルの最も長い行の長さを取得する方法を知っています awk

awk ' { if ( length > L ) { L=length} }END{ print L}' file.txt

しかし、ディレクトリ内のすべてのファイルの最長行の長さを取得するにはどうすればよいですか?

回答:


11

最も簡単な解決策は、すべてのファイルを連結し、結果をスクリプトにパイプすることです。

cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'

また、いくつかのファイルをawkに直接渡すこともできます。

awk '{ if ( length > L ) { L=length} }END{ print L}' ./*

もちろん、ファイルが実際にディレクトリにある場合は警告が表示されますが、無害であるべきです。バイナリファイルにはlineという概念がないため、大きな問題が発生する可能性があります。したがって、より具体的にするために、次のようなことができます

 awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt

.txt現在のディレクトリ内のファイルのみに一致します。

そして、@ G-Manがコメントで述べたように、*隠しファイル(ドットで始まる)とは一致しません。それらが必要な場合は、を使用してください* .*


または、ほぼ間違いなくcat * .* | ...。またはと言うの無駄な使用を排除しますawk '...' * .*
G-Manが「Reinstate Monica」と言う14

@ G-Man確かに。あなたがコメントしたとき、私はそれに関する私の答えを編集していました。:-) catとファイルを連結することは、最初は簡単に思えたので、最も簡単です。
lgeorget 14

4

GNUの場合wc

cat *.txt|wc -L

-L 最も長い行の長さを出力します。


4

GNU awkでファイルごとの最大長が必要な場合:

find . -type f -exec awk -v l=0 '
   length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +

または、すべてのファイルの1つの最大長:

find . -type f -size +1c -exec cat {} + |
  awk -v l=0 'length>l {l=length}; END{print l}'

これは、ファイルが改行文字で終わることを前提としています。1つのファイルが改行文字で終わらない場合、その区切りのない最後の行は次のファイルの最初の行とマージされ、結果が無効になる可能性があります。

-size +1c 空のテキストファイルまたは1文字のみを含むテキストファイルはそれぞれ0行と1行の空行があるため、最長の行はないため、最適化です。


これらはテキストファイルなので、改行文字で終わります(空でない限り)。
ジル 'SO-悪であるのをやめる'

0

また、GNU wc(coreutils 8.4)では、複数のファイルを処理できます

wc -L *.txt
  • 個々のファイルの長さをリストします
  • すべてのファイルの最長の長さを提供します

これは本質的に、この他の回答が言及wc -Lしていることですが、ソリューションには、他のすべてのファイルの最大長を最初に調べる必要があるという欠点があります。その点で何か利点はありますか?
アントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.