
次の方法を探しています。
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
来、最後にランダムな文字が来るプロセスがあるファイルです。2
6
各行を文字ごとに分割し、/
その間にフィールド、、、、の後に文字列が続く行を形成します。5
6
7
8
/
",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]*