Shell-Script

shell腳本中的文件操作

  • October 11, 2022

我需要提取以唯一模式開頭的行數,並按以下格式列印模式和出現次數。模式分隔符應該是 /。

file.txt 包含以下條目

path1/path1/Dockerfile
path1/path1/path1.config
path2/inputdir/Dockerfile
path2/inputdir/path1.config
path2/outputdir/path1.config
pipelines/pipeline1.yml
pipelines/jobs/job1.yml

和輸出應該如下

path1=2
path2=3
pipelines=2

我正在使用 awk,如下所示,但它需要模式匹配作為輸入(如 path1,而這需要動態驅動。

awk '/^path1/{a++}END{print a}' files.txt

有人可以就此提出建議。謝謝。

您希望跟踪每個頂級目錄名稱的計數。這是最簡單的使用關聯數組來完成的awk,其中目錄名稱是鍵。然後我們可以將每一行讀取為一組 -/分隔的欄位,以便輕鬆訪問目錄名稱(第一個欄位):

awk -F / '{ count[$1]++ } END { for (name in count) printf "%s=%s\n", name, count[name] }' file

使用多行程式碼佈局:

awk -F / '
   { count[$1]++ }
   END {
       for (name in count)
           printf "%s=%s\n", name, count[name]
   }' file

讓人想起您自己的程式碼,但不會嘗試在每行的開頭匹配特定的字元串。相反,鑑於欄位是由(我們在命令行上/安排的)分隔的,我們用 . 選擇第一個欄位。-F /``$1

然後將第一個欄位的值用作名為 的數組中的鍵count。雖然您使用標量變數 ,a但數組 inawk可用於一次跟踪許多不同的值,我們只需遞增與第一個欄位關聯的值。

最後,我們循環遍歷count數組中所有收集到的鍵,並將它們與每個鍵關聯的值一起列印出來。

請注意,輸出是無序的,並且根據awk您使用的內容,每次執行命令時它可能會以不同的順序顯示。


如果輸出格式不太重要,那麼您也可以通過用 刪除第一個欄位cut,對其進行排序(如果數據尚未排序),然後計算唯一字元串來解決此問題:

$ cut -d / -f 1 file | sort | uniq -c
  2 path1
  3 path2
  2 pipelines

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