Shell-Script
shell腳本中的文件操作
我需要提取以唯一模式開頭的行數,並按以下格式列印模式和出現次數。模式分隔符應該是 /。
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