
私のフォルダには、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 1
findを非再帰的に作成します(つまり、サブディレクトリを検索しません)。利用できない-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コマンドを使用できます。