.txt
1つのディレクトリに複数のファイルがあります。各ファイルには次のセクションがあります。
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
各ファイルの各セクションの履歴が印刷されます。つまり、そのセクションがないと何も印刷されません。これを印刷するには、0
GNUの実装awk
とBEGINFILE
特別な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