我正在編寫一個報告工具,它處理某些應用程序的源文件,並生成一個包含兩列的報告表,一列包含文件的名稱,另一列包含單詞TODO
如果該文件包含對某些棄用函數deprecated_function
和DONE
的調用,則以其他方式。如何重寫一個Awk腳本來處理多個文件而不是一個
我用awk
編寫本報告和我的shell腳本看起來像
report()
{
find . -type f -name '*.c' \
| xargs -n 1 awk -v deprecated="$1" '
BEGIN { status = "DONE" }
$0 ~ deprecated{ status = "TODO" }
END {
printf("%s|%s\n", FILENAME, status)
}'
}
report "deprecated_function"
這個腳本的輸出看起來像
./plop-plop.c|DONE
./fizz-boum.c|TODO
這種運作良好,但我想重寫awk
腳本以便它支持多個輸入文件而不僅僅是一個 - 這樣我就可以將-n 1
參數移除到xargs
。我能找到的唯一解決方案涉及很多簿記,因爲我們需要跟蹤FILENAME
和END
事件的更改,以捕獲文件事件的每個結束。
awk -v deprecated="$1" '
BEGIN { status = "DONE" }
oldfilename && (oldfilename != FILENAME) {
printf("%s|%s\n", oldfilename, status);
status = DONE;
oldfilename = FILENAME;
}
$0 ~ deprecated{ status = "TODO" }
END {
printf("%s|%s\n", FILENAME, status)
}'
也許有一個更清潔和更短的方式來處理這個問題。
我使用的是FreeBSD的awk
,我正在尋找與此工具兼容的解決方案。
這*是一個改進!感謝您的見解! – 2014-09-27 15:40:46
+1用於避免重複並確保沒有輸入=不輸出 – 2014-09-27 15:49:46