ファイルの末尾に空白行があるファイルがあります。grep
スクリプトから変数に渡されたファイル名を使用して、ファイルの末尾の空行数を計算できますか?
答え1
空行がある場合ただ最後に
grep -c '^$' myFile
または:
grep -cx '' myFile
答え2
ただ楽しんで何か気味悪いですねsed
。
#!/bin/sh
sed '/./!H;//h;$!d;//d;x;s/\n//' "$1" | wc -l
説明する:
/./
すべての文字を含む行を指定するため、空の行/./!
(たとえば/^$/
、反対のパターンを再利用したい)は、コマンドがH
それを予約済みスペースに追加します。したがって、空の行ごとに予約済みスペースに1行を追加すると、空の行数よりも1行が常に多くなります。この問題は後で取り上げます。//h
空のパターンはすべての文字である最後の正規表現と一致するため、空でない行は処理されます動く収集された行を1に「リセット」して、コマンドを介してスペースを予約しますh
。次の空行を追加すると、期待どおりに2行が再表示されます。$!d
最後の行を除くすべての行の出力なしでスクリプトを停止するため、最後の行以降の追加コマンドのみが実行されます。したがって、予約済みスペースに収集されたすべての空行はファイルの末尾にあります。いいね//d
:d
空白以外の行に対してのみコマンドを再実行します。したがって、最後の行が空でない場合は、sed
出力なしで終了します。ゼロライン。いいねx
ストレージスペースとパターンスペースを交換すると、収集された行が処理のためにパターンスペースに入るようになります。- しかし、一行が多すぎることを覚えているので
s/\n//
。 - 望むより!行数は最後の空行数と一致するため(最初の行は空ではありませんが、誰が気にするかを参照)、これを使用して計算できます
wc -l
。
答え3
追加のGNU tac
/tail -r
オプション:
tac file | awk 'NF{exit};END{print NR?NR-1:0}'
または:
tac file | sed -n '/[^[:blank:]]/q;p' | wc -l
出力で以下を参照してください。
printf 'x\n '
つまり、最後の行全体の後に余分な空白がある場合(一部は余分な空白行と見なすことができますが、POSIXテキスト定義に従って有効なテキストではない)、そのスペースはゼロになります。
POSIX的に:
awk 'NF{n=NR};END{print NR-n}' < file
ただし、これはファイル全体を読み取ることを意味します(tail -r
/はtac
検索可能ファイルの終わりからファイルを上下に読みます)。これは1
の出力を提供しますprintf 'x\n '
。
答え4
なぜなら、あなたが実際に求めているからです。grep
解決策私はこれをGNUにのみ依存するように追加しますgrep
(まあ、シェル構文とecho
...も使用します):
#!/bin/sh
echo $(( $(grep -c "" "$1") - $(grep -B$(grep -cv . "$1") . "$1" |grep -c "") ))
私はここで何をしているの?$(grep -c ".*" "$1")
ファイル内のすべての行数を計算し、次の空白行なしでファイルを減算します。
そしてこれらを得る方法は何ですか?$(grep -B42 . "$1"
空でないすべての行とその前の42行を把握します。したがって、空でない行の前に42個以下の連続した空白行がある限り、空白ではなく最後の行まですべてを印刷します。この制限を避けるために、空行の総数を$(grep -cv . "$1")
オプションの引数として渡すので、常に十分に大きくなります。-B
これにより、後続の空白行を削除し、それを使用して|grep -c ".*"
行数を計算できます。
本当に素敵ではないですか? (-;