Bashスクリプトで$ REPLYの文字列トークン化

Bashスクリプトで$ REPLYの文字列トークン化

これは私の最初の投稿です。 StackExchage、Google、Wiki、GNU、インターネット以前はどのように管理したのかわかりません:)

現在、次のようなSQLデータベースジェネレータbashスクリプトを作成する方法を見つけようとしています。

renice -n 19 $$;

idx=32768;
dbt='Radix_en';

cat Domains_en.txt;
cat Tables_en.txt;

while read; 
do
checks="$(echo -n $REPLY | md5sum)";
checks=${checks%"  -"};

echo "insert into $dbt values ($idx,'$(uuidgen)','${checks}',$REPLY);";
idx=$((idx+1));

done < Data.txt;
echo "commit;";

データはData.txtで提供され、現在の形式は次のとおりです。

'NUMBER','US_EN','LATIN','GREEK','GERMAN'
0,'zero','nulla','μηδέν','Null'
1,'one','Unum','ένα','ein'

出力は有効なSQLです(Firebird用)。

create domain ...;
create domain ...;
commit;

create table ( ... );
create table ( ... );
commit;

insert into Radix_en values (32768,'dff0207a-591f-4435-9f8b-7b9b3e6ba2c1','d1f77359b3f7236806489ba3108c771f','NUMBER','US_EN','LATIN','GREEK','GERMAN');
insert into Radix_en values (32769,'5ef0e634-5c96-4ae4-92a8-0d68c02ffeb6','4e3f710600230cf0520bf32269511062',0,'zero','nulla','μηδέν','Null');
insert into Radix_en values (32770,'eae9cacc-3ee3-4471-afad-e5af201da435','9ab2f782988416431238ec63277b11df',1,'one','Unum','ένα','ein');
commit;

区切り文字を含むフルテキスト行を生成するのではなく、各フィールドに対してMD5チェックサムを生成する方法を探したいと思います。

Data.txt形式はまだ確認されていないため、これを可能にするか、より簡単に作成できる形式に変更できます。

また、複数の個別のステップが必要な場合でも問題ありません。プロセス全体がスクリプトで作成され自動化される必要があるためです。 Data.txtを最初に処理してから、このスクリプトで実行するつもりですが、プロセスをできるだけ簡単にしたいと思います。さまざまな Data.txt ファイルの数がかなり多く、含める必要がある他のプロセッサもたくさんあります。

実際、私はbashスクリプトについてもっと学びたいと思っています。具体的な解決策ではなく、この問題に対する専門家のアプローチとアドバイスを探しています。

私の投稿のタイトルが私に必要な解決策であるかどうかわからないので、私の問題に関連しています。この記事を定期的に訪問するスーパーユーザーに投稿するのか、それともここに投稿するのかわかりません。だからここに先に書いてみましょう、少し足りなかったらすみません。

ありがとうございます!

サンダル

... 2014年8月23日午前3時にさらにコンテンツを追加するように編集されました。

IFSを使用したmikeservのおかげで動作するので、私のスクリプトは次のようになります。

renice -n 19 $$ > /dev/null; #for now

idx=32768;
dbt='Radix_en';

cat Domains_en.txt;
cat Tables_en.txt;

while read; 
do

gid="$idx,'$(uuidgen)'";

IFS=,; set -f # no gobbling!
echo "insert into $dbt values ($gid";
    for field in $REPLY
    do  
    printf '%s' ",$field,'";
    printf '%s' "$field" | md5sum;
    done | cut -d\  -f1;


echo "$var);";

idx=$((idx+1));

done < Data.txt;

出力は優れており、改行を使用するとテキストの編集/検索がはるかに簡単になり、Firebirdは1つを除いてまだ満足しています。

出力は次のとおりです。

create domain ...;
create domain ...;
commit;

create table ( ... );
create table ( ... );
commit;

insert into Radix_en values (32768,'303f8957-57cf-4485-ace4-d21c7cf144e6'
,'NUMBER','722d79c16b51fe86610972b8d950038c
,'US_EN','b63fb39e32b062c76694bec58c4f8c67
,'LATIN','fd6f27a3c59111fc2a0b5e452595ef3d
,'GREEK','c081310697bb6b7d7bed5034824e2530
,'GERMAN','15db1d0e1b0861d8ac1f391db801493a
);
insert into Radix_en values (32769,'e7fdf095-d31c-4c59-a23b-7ea67db7aefb'
,0,'cfcd208495d565ef66e7dff9f98764da
,'zero','01b40535afbfd9611e910f58f4ab5146
,'nulla','584edd0b6638798dee53e2c23e84e2d1
,'μηδέν','cd3ed2f1039ed8668b4d48e742bd2e5b
,'Null','e0a93a9e6b0eb1688837d8bab9b4badb
);
insert into Radix_en values (32770,'a21916b5-2a05-4656-ad4e-c8cfee1abfcc'
,1,'c4ca4238a0b923820dcc509a6f75849b
,'one','7e31533231a12e4a560a18ac8cd02112
,'Unum','05d92bcbffbf59b375f25945e9af2dd0
,'ένα','826f5e2d5ba7ace48f4d6fe3c5e2925f
,'ein','dcc09a2cb665ca332d1689cb11aff592
);
commit;

md5ハッシュの末尾に区切り文字がありません。パイプと出力を交渉する方法がわかりません。私がここで理解していないものは何ですか?

この特別なケースでは、データフィールドはプログラマブルIC用のコードを保持しているため、区切り文字間のチェックサムに余分な文字が許可されていないか、これまでのように見えます。繰り返しますが、コードはASCII形式で、区切り文字はASCIIの一部ではないので安全です。 FirebirdはASCII以外のコンテンツも拒否します。

IFSが今見てきたいくつかの新しい問題(たとえば、Windowsのファイルパス)ですでに問題が発生しているので、このスクリプトを完了する方法を親切に教えていただければ幸いです。私はこのスクリプトが一般的なASCIIでどのように機能するかを見て、さらに多くの質問を含む別の投稿を作成したいと思います。

助けてくれてありがとうございます!

サンダル

... 2014年8月30日午後7時最終版に変更

cutをsedに置き換えるとうまくいくようです。 Firebirdフィールドの入力はまだセミコロン( ')をエスケープし、別の同じセミコロンを追加する必要があり、データファイルの現在のカンマIFS区切り文字はまだASCII区切り文字で置き換える必要があります。スクリプトは、再帰ファイルのリストではなく、単一のファイル入力です。 echoはおそらくprintfに置き換えられるべきです。

Shebangのない最終スクリプトは次のとおりです。

renice -n 19 $$ >> Radix_en_log.txt;

idx=32768; dbt='Radix_en';
cat Domains_en.txt; cat Tables_en.txt;

while read;     do
gid="$idx,'$(uuidgen)'";

IFS=,; set -f;
echo "insert into $dbt values ($gid";
    for field in $REPLY
    do  
        printf '%s' ",$field,'"; printf '%s' "$field" | md5sum;
    done | sed "s/[ ][ ][-]/\'/g"; printf '%s\n' ");";
    idx=$((idx+1));
        done < Data.txt;
echo "commit;";

出力は次のとおりです。

create domain ...;
create domain ...;
commit;

create table ( ... );
create table ( ... );
commit;

insert into Radix_en values (32768,'2f675b86-b2b4-4e52-b000-e6a8cf0f3dca'
,'NUMBER','722d79c16b51fe86610972b8d950038c'
,'US_EN','b63fb39e32b062c76694bec58c4f8c67'
,'LATIN','fd6f27a3c59111fc2a0b5e452595ef3d'
,'GREEK','c081310697bb6b7d7bed5034824e2530'
,'GERMAN','15db1d0e1b0861d8ac1f391db801493a'
);
insert into Radix_en values (32769,'e2afcd65-9a1b-49e3-baf1-74b0619a4776'
,0,'cfcd208495d565ef66e7dff9f98764da'
,'zero','01b40535afbfd9611e910f58f4ab5146'
,'nulla','584edd0b6638798dee53e2c23e84e2d1'
,'μηδέν','cd3ed2f1039ed8668b4d48e742bd2e5b'
,'Null','e0a93a9e6b0eb1688837d8bab9b4badb'
);
insert into Radix_en values (32770,'f51b72eb-d64f-4e9e-ab49-8954df9505cd'
,1,'c4ca4238a0b923820dcc509a6f75849b'
,'one','7e31533231a12e4a560a18ac8cd02112'
,'Unum','05d92bcbffbf59b375f25945e9af2dd0'
,'ένα','826f5e2d5ba7ace48f4d6fe3c5e2925f'
,'ein','dcc09a2cb665ca332d1689cb11aff592'
);
commit;

ありがとうございます!

サンダル

答え1

シェルには組み込みの可変拡張フィールド区切り文字があります。したがって、文字列があり、区切り文字が固定されている場合は、次のことができます。

var=32768,'dff0207a-591f-4435-9f8b-7b9b3e6ba2c1','d1f77359b3f7236806489ba3108c771f','NUMBER','US_EN','LATIN','GREEK','GERMAN'
(   IFS=,; set -f
    for field in $var
    do  printf '\n%s\n\t' "$field - md5:" >&2
        printf %s "$field" |
        md5sum
    done |
    cut -d\  -f1
)

32768 - md5:
        f43764367fa4b73ba947fae71b0223a4

dff0207a-591f-4435-9f8b-7b9b3e6ba2c1 - md5:
        0983e6c45209f390461c1b1df9320674

d1f77359b3f7236806489ba3108c771f - md5:
        07d82ab57ba81f991ab996bd7c5a0441

NUMBER - md5:
        34f55eca38e0605a84f169ff61a2a396

US_EN - md5:
        c9d3e580b7b102e864d9aea8703486ab

LATIN - md5:
        0e869135050d24ea6e7a30fc6edbac6c

GREEK - md5:
        d4cacc28e56302bcec9d7af4bba8c9a7

GERMAN - md5:
        ed73cca110623766d7a2457331a4f373

これは私のように改行で区切られたmd5のリストを提供します。

IFS=,変数タイプシェル拡張が実行されると、シェルがそれを,代わりに文字に分割する必要があることを指定するために使用されます<space><newline><tab>。これがデフォルトです。set -fシェルが引用符で囲まれていない拡張子からファイル glob を検出すると、拡張しないように指定するために使用されます。したがって、echo *現在のディレクトリの内容に関係なく、globだけが印刷されます。*

$varシェルの各カンマ区切りフィールドprintf "$field" | md5sumについて、フィールドごとに一度、区切り文字列なしで質問の意味を理解します。最後に、各出力ラインが受信されると、末尾のいくつかのスペースの合計が切り捨てられますcut-ほとんどの出力は実際に見ることができますstderrcutmd5sums

関連情報