sedはパターン間の行数を計算します - 複数のファイル

sedはパターン間の行数を計算します - 複数のファイル

.txt1つのディレクトリに複数のファイルがあります。各ファイルには次のセクションがあります。

DONE
item 1
item 2
item 3
DONE

DONE各ファイルの2つのタグ間の行数を別々に計算したいと思います。

使ったこの問題これを生成します。

sed -n "/DONE/,/DONE/ p" *.txt | wc -l > ~/word_count.txt

ただし、これにより各ファイルの数が単一の数字にまとめられます。代わりに、次のような出力が必要です。

file1.txt 3
file2.txt 5
file3.txt 6

ベストアンサー1

より良いawk使用計算

awk '
  FNR == 1 {inside = 0}
  $0 == "DONE" {
    if (inside) print FILENAME, n
    n = 0
    inside = ! inside
    next
  }
  inside {n++}' ./*.txt

これにより、DONE...DONE各ファイルの各セクションの履歴が印刷されます。つまり、そのセクションがないと何も印刷されません。これを印刷するには、0GNUの実装awkBEGINFILE特別なENDFILE文が必要です。

awk '
  BEGINFILE {DONE_count = 0}
  $0 == "DONE" {
    if (++DONE_count % 2 == 0) print FILENAME, n
    n = 0
    next
  }
  DONE_count % 2 {n++}
  ENDFILE {if (!DONE_count) print FILENAME, 0}' ./*.txt

awkまたはファイルごとに1つずつ実行します。

for file in ./*.txt; do
  awk '
    $0 == "DONE" {
      if (++DONE_count % 2 == 0) print FILENAME, n
      n = 0
      next
    }
    DONE_count % 2 {n++}
    END {if (!DONE_count) print FILENAME, 0}' "$file"
done

おすすめ記事