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