複数のファイルの中で最も長い行の長さを見つけて印刷しますか?

複数のファイルの中で最も長い行の長さを見つけて印刷しますか?

私のフォルダには、A0001-A2000というラベルの付いたファイルが2000個あります。各ファイルの2行目には、長い(最も長くなければならない)行文字があります。 2行目の長さで、1つの出力にすべてのファイル名を印刷したいと思います。

だから出力は次のようになります

A0001 231
A0002 123
A0003 56

役に立つ場合は、ファイルの最長行を印刷するコードがすでにありますが、より簡単な方法がある場合はawkを使用しません。

$ awk '{print length}' A0001.txt |sort -nr|head -1
231

答え1

awk 'FNR==2{print FILENAME,length; nextfile}' *

globはディレクトリ内のすべてのファイルに展開され、Awkが2行目に達すると、ファイル名と長さを印刷して次のファイルに移動します。これはnextfileオプションであり、パフォーマンスのみを目的としています。

ディレクトリに異常なファイルがある可能性がある場合は、Findを使用してawkがフリーズしないようにしてください。

find . -type f -maxdepth 1 -exec awk 'FNR==2{print FILENAME,length; nextfile}' {} +

-maxdepth 1findを非再帰的に作成します(つまり、サブディレクトリを検索しません)。利用できない-prune場合は-maxdepth使用できます。

答え2

最大ラインの場合おそらく2行目では、次の操作を行います。

  • GNU awkの使用

    gawk '
        BEGINFILE {max = -1} 
        length > max {max = length} 
        ENDFILE {print FILENAME, max}
    ' *
    
  • GNUではなくawkを使う

    awk '
        FNR == 1 {
            if (filename != "") print filename, max
            filename = FILENAME
            max = -1
        }
        length > max {max = length}
        END {print filename, max}
    ' *
    

答え3

一般的に、GNU wcはそれをしなければなりません。

wc -L A*
  • ファイルがコマンドラインをブロックしないとします。この場合、forループまたはfindコマンドを使用できます。

関連情報