ファイルを順次ロード

ファイルを順次ロード

シェルスクリプトで同じファイル名を持つ複数のファイルをロードする必要がありますが、各ファイル名の前にYYMMDDPERSONNELを追加する必要があります。例: 231102PERSONNEL と 230103PERSONNEL 同じディレクトリに異なるファイルがたくさんあるため、ソート時にファイル名が重要です。ロードするファイルを古いものから最新のものに並べ替える必要があります。

現在私が持っているのは、一度に1つのファイルのみを処理するように設計されています。

答え1

これはパイプを使った簡単な作業です。

find . -maxdepth 1 -type f -name '*PERSONNEL.gz' -print | \
    sed -e 's%^./%%' | \
    sort | \
    xargs -r /bin/echo 

manページを読んでください。

簡単な概要は次のとおりです。

  • findファイル名リストの印刷STDOUT
  • sedもっと見やすくする(./231102PERSONNEL.gzに変更231102PERSONNEL.gz
  • sortリストを並べ替えます。
  • xargsできるだけ多くのファイルを配置します(xargs --show-limits </dev/null参照あなたの制限)リストの残りの部分に対して「コマンド」を繰り返します。
  • /bin/echoプレースホルダーです。

答え2

デフォルトでは、シェル全体は語彙的に拡張され、あなたの場合、語彙順は年代順(順番に)ファイルはすべて同じ世紀に属している必要があります(例:20世紀が実際には1901年から2000年までであることを無視し、1900年から1999年まで)。

そしてzsh

set -o extendedglob
for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) gunzip < $f | your-sql-loader

(または同じ順序でファイルが[0-9](#c6)PERSONNEL.sql.gz(NOn)必要な場合は、元の要求の逆(大文字)を実行してください)。Ono

your-sql-loader標準入力から入力を取得できるとします。ファイル名パラメータとして渡す必要がある場合:

for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) your-sql-loader <(gunzip < $f)

または、filename引数が通常のファイルである必要がある場合:

for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) your-sql-loader =(gunzip < $f)

あなたはおそらく次のことができるでしょう:

gunzip -dc -- [0-9](#c6)PERSONNEL.sql.gz | your-sql-loader

つまり、逆並べ替えられたすべてのファイルの圧縮されていないすべてのコンテンツをリンクしますyour-sql-loader

より一般的には、圧縮されていないバージョンのファイルをディスクに保存する必要はほとんどありません。すぐに解凍し、同時に使用するすべてのアプリケーションで使用できるようにすることをお勧めします。

コンシューマアプリケーションがデータを順番に読み取らない場合(そうであればここでは驚くべきこと)、ディスクから解凍することができます(=(...)上記のように一時ファイルから出力を取得する)gunzipSQL)。

タグが示すように、(t)cshを使用する必要がある場合(この世紀は非常に驚くべきことになります。ファイル名に改行文字が含まれていないと仮定すると):

gunzip -dc -- "`ls -rd -- [0-9][0-9][01][0-9][0-3][0-9]PERSONNEL.sql.gz`" | your-sql-loader

ここでls -r、ファイルは名前に基づいて逆順にソートされます。対応する"`...`"出力は検索され、空白ではなく行コンポーネントで区切られます。

6桁の数値の一致に対応するzshまたはkshがcshないため、各番号を具体的に一致させ、月と日の数値をより厳密に一致させる機会を得ます。[0-9](#c6){6}([0123456789])

oe[code]前世紀のファイルがある場合、o+functionまたはglob修飾子を使用してzshでカスタムソート順序を定義できます。

[0-9](#c6)PERSONNEL.sql.gz(Noe['REPLY[1,0]=$(( 19 + ($REPLY[1,2] < 70) )'])

つまり、最初の2桁の数字が70より大きいか小さいかどうかに応じて、ファイル名の前に20または19を追加してglobをソートするようにzshに指示します(実際のデータセットの年に応じてカットオフを調整する必要があります)。 ;ここでは、Unix時代の始まりである1970を選択しました。

関連情報