Sed
Sed 腳本到 AWK
我不經常這樣做,而且當我這樣做時,總是很敏感。我有下面的 sed 腳本,它從超過一百萬個文件中提取數字模式。我需要將它發送到 AWK,因此當找到匹配的模式時,它會列印找到它的文件名。行號會很好,但不要貪心。
期望的輸出
文件名1 000-323423-33
文件名2 000-323423-33
文件名3 000-323423-33
我嘗試了各種方法,但沒有任何效果,有經驗的人可以提供適當的指導嗎?先感謝您!
#!/bin/sh #shopt -s nullglob FILES=/mnt/c/temp/1/*.txt for f in $FILES do echo "Processing $f" sed -nr \ -e '/[0-9]{3}-[0-9]{6}-[0-9]{2}/{ s/.*([0-9]{3}\-[0-9]{6}\-[0-9]{2}).*/\1/ G p }' $f done
看來你的任務就是
grep
在做什麼。如果您真的不想要冒號,請使用空格替換它們tr
,假設文件名中不存在冒號。grep -Eon '[0-9]{3}-[0-9]{6}-[0-9]{2}' *.txt | tr ':' ' '
輸出將如下所示:
file1 10 000-323423-33 file2 20 000-323423-34 file3 30 000-323423-35 file3 31 000-323423-36
@thanasisp 是對的,
grep
非常適合這份工作。使用 awk,您可以編寫
awk -v OFS=, ' match($0, /[0-9]{3}-[0-9]{6}-[0-9]{2}/) { print FILENAME, FNR, substr($0, RSTART, RLENGTH) } ' /mnt/c/temp/1/*.txt
參考:https ://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
有了這麼多文件,您可能會收到“參數列表太長”的錯誤。那是你需要的時候
find
find /mnt/c/temp/1/ -type f -name '*.txt' -exec awk -v OFS=, ' match($0, /[0-9]{3}-[0-9]{6}-[0-9]{2}/) { print FILENAME, FNR, substr($0, RSTART, RLENGTH) } ' '{}' +