AWKのSedスクリプト

AWKのSedスクリプト

私はこれを頻繁にやらず、時はいつも非常に敏感です。百万を超えるファイルから数値パターンを抽出する次の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

答え1

あなたがやっていることがまさにあなたの使命のようです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

答え2

@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)
  }
' '{}' +

関連情報