1

だから私は昨夜からこれに夢中になっていて、私が望んでいないだけでなく、多くのことが起こる可能性があります。

ディレクトリ内の行数が最も多いファイルを見つけて、ファイルの名前とそのファイルの行数を出力するコードが必要です。

ディレクトリの行全体を印刷することはできますが、いわばフィールドを狭めることができないようです。

愚かな学習者の助けになるものはありますか?

wc -l $1/* 2>/dev/null
   | grep -v ' total$'
   | sort -n -k1
   | tail -1l

別の質問でプロの助けを借りた後、これが私がたどり着いたところですが、それらはすべて返され、行数は出力されません。

4

2 に答える 2

1

次の awk コマンドでジョブが実行され、冗長なパイプ コマンドをすべて回避できます。

wc -l $1/* | awk '$2 != "total"{if($1>max){max=$1;fn=$2}} END{print max, fn}'

更新: wc の出力の最後の行を避けるために、これは awk コマンドの方が良いかもしれません:

wc -l $1/* | awk '{arr[cnt++]=$0} END {for (i=0; i<length(arr)-1; i++) 
                  {split(arr[i], a, " "); if(a[1]>max) {max=a[1]; fn=a[2]}} print max, fn}'
于 2013-06-12T15:31:13.087 に答える
0

あなたが試すことができます:

wc -l $1/* | grep -v total | sort -g | tail -1

実際には、「total」を含むファイルも削除する grep を避けるために:

for f in $1/*; do wc -l $f; done | sort -g | tail -1

コメントで提案されているように、さらに良い:

wc -l $1/* | sort -rg | sed -n '2p'

関数にすることもできます:

function get_biggest_file() {
    wc -l $* | sort -rg | sed -n '2p'
}

% ls -l
...  0 Jun 12 17:33 a
...  0 Jun 12 17:33 b
...  0 Jun 12 17:33 c
...  0 Jun 12 17:33 d
... 25 Jun 12 17:33 total
% get_biggest_file ./*
5 total

EDIT2:私が与えた関数を使用すると、次のように必要なものを簡単に出力できます:

get_biggest $1/* | awk '{print "The file \"" $2 "\" has the maximum number of lines: " $1}'

編集:質問で書いたように関数を書き込もうとした場合は、次のように行継続文字を最後に追加する必要があります。そうしないと、シェルは4つのコマンドを発行しようとしていると見なします:

wc -l $1/* 2>/dev/null \
   | grep -v ' total$' \
   | sort -n -k1 \
   | tail -1l
于 2013-06-12T15:19:36.330 に答える