Sed

Sed 腳本到 AWK

  • May 20, 2022

我不經常這樣做,而且當我這樣做時,總是很敏感。我有下面的 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)
 }
' '{}' +

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