Bash

模式之間的 sed 計數行 - 多個文件

  • April 21, 2017

.txt在一個目錄中有多個文件。每個文件都有一個部分:

DONE
item 1
item 2
item 3
DONE

我想分別計算DONE每個文件的兩個標記之間的行數。

我用這個問題來創建這個:

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

但這會將每個文件的計數合併為一個數字。相反,我想要這樣的輸出:

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

更好地使用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每個文件執行一個:

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

引用自:https://unix.stackexchange.com/questions/360469