キャプチャパターンファイル名を見つけてリダイレクトします。

キャプチャパターンファイル名を見つけてリダイレクトします。

次の方法を探しています。

find /path -name "201[2-6]*" | awk -F"/" '{print $5"/"$6"/"$7"/"$8",0,0,0"}' > archives_201\1.csv

ファイル名をキャプチャした結果かもarchives_201\1.csvしれません。archives_201[2-6].csv

私は一年中循環することでこれを行うことができることを知っています。そのフォルダには約1億のファイルが含まれているため、避けるべきです。

[編集する]

私も試しました

 find /path -name "201[2-6]" | awk -F"/" 'BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}' 

しかし、得た

awk: BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}
awk:                                                                  ^ syntax error

ベストアンサー1

質問1:

/path名前がで始まり、との間に単一の数字が201来、最後にランダムな文字が来るプロセスがあるファイルです。26

各行を文字ごとに分割し、/その間にフィールド、、、、の後に文字列が続く行を形成します。5678/",0,0,0"

この行と次の行を file というファイルに保存します。ファイル名の後には、archives_201以前に入力ファイル名で見つかったのと同じ単一の数字が続き、拡張子は.csv.

解決策1:

awk -F/ '
    FNR==1 {match(FILENAME, /\/(201[2-6])/, m)}
    {print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"}
' /path/201[2-6]*

コメント:

サンプル入力ファイルと目的の出力を提供していないので、いくつかの点でいくつかの推測をする必要がありました。

以下を使って何を達成したいのかわかりません> ${8:0:4}"_export_0504.csv"

find結果をパイピングするとawk混乱します。実際に各ファイルを読みますかawk、それともテキストリストのみを処理しますか?後者の場合、フィールドの厳密な構成($5"/"$6"/"$7"/"$8)のために、すべてのファイルが同じディレクトリにある必要があります。なぜ使用しますかfind

filename以外の検索文字列で始まるパス部分がないとします201[2-6]>>必要に応じて上書きするのではなく、同じファイルに複数の行を追加したいとします>。すべてのファイルが同じディレクトリにあるとし、awkファイルを処理するとします。コンテンツしかし、記録上では名前

しかし、フィールド区切り記号として選択したのは/後者の仮定を意味するので、これについても扱おうとします。


質問2:

のファイルのファイル名を処理します/path。名前はで始まり、201その後にと2の間に単一の数字が続き、6最後にランダムな文字が続きます。

各ファイル名を文字に基づいて分割し/、5番目、6番目、7番目、および8番目のコンポーネント(/間の内容は保持)で1行を構成してから文字",0,0,0"列を作成します。

この行と次の行は、名前の後にarchives_201ファイル名の前にある同じ単一の番号(拡張子.csv

解決策2:

awk -F/ '
    FNR==1 {
        match(FILENAME, /\/(201[2-6])/, m);
        $0=FILENAME;
        print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"
    }
' /path/201[2-6]*

おすすめ記事