複数のレコードを含むファイルがあり、各レコードには複数のフィールドがあります。ファイルの内容は次のとおりです。
# cat inputfile
name: AAA
age: 38
city: C1
state: S1
age: 29
city: C2
name: BBBbbbB
state: S2
state: S3
age: 21
city: C3
name: ccccccC
シェルスクリプトのパラメータで指定された順序で各レコードのフィールドをソートしたいと思います。
次のスクリプトを実行すると:
# sh sortout.sh <inputfile> name age city state
出力は次のようになります。
name: AAA
age: 38
city: C1
state: S1
name: BBBbbbB
age: 29
city: C2
state: S2
name: ccccccC
age: 21
city: C3
state: S3
答え1
短絡モードで作業するとき、Perl
これはPerlがこのオプションを使用して一度に1段落ずつ食べることを意味します-00
。
次に、現在のレコードから最初のフィールド(コロンで区切り)を取得し、ハッシュに保存します。
$ perl -l -00ane '
my %h = reverse /^(([^:]+):.*)$/mg;
print $h{$_} for qw/name age city state/;
' input.file
特定の要件に応じて、次のことができます。
cat - <<\eof > code.sh
if=$1;shift
perl -ls -00ane '
my %h = reverse /^(([^:]+):.*)$/mg;
print $h{$_} for split /\s+/, $order;
' -- -order="$*" "$if"
eof
コードファイルを生成して実行します。
sh code.sh inputfile name age city state
答え2
あなたはPerlを知らないので、もっと冗長に説明します。
まず、Perlは入力ファイルをインポートし、コマンドを介して変換して目的の出力を生成するLinuxユーティリティです。
通常、Perlは入力ファイルを一度に1行ずつチェックします。 1行はASCII文字\012
(改行文字とも呼ばれます)で、次の行と\n
区別されます。ただし、この場合は一度に1つの段落を読むことをお勧めします。 Perlはparaをどのように識別しますか?
-00
オプションは段落を処理します。現在のレコードスカラーに保存されます。$_
レコードには複数の行を含める必要があります。
^....$ ^...$ ^....$
私はそれを基本的に連続した線の島だと想像しています。島は \n で区切られます。
使用されるPerlオプション:
-l
これは2つのことを行います。現在のレコード $_ から入力レコード区切り文字を削除し、印刷時に再挿入します。
$/ = $\ = "\n"
-s
これにより、デフォルトのコマンドラインスイッチ解析が有効になります。これにより、コマンドライン自体から変数が印刷される順序を指定できます。
-00
例 IRS 区切り文字は、短絡モード = 空の文字列に設定されます。これにより、入力データから一度に1つの段落が抽出され、$_
forの各反復ごとに保存されます。
-n
これにより、ファイルの周りにループが発生します。つまり、入力ファイル(実際にはファイルハンドルですが、これは私たちのレベルでは重要ではありません)から読み取られますが、変換がすべて現在のレコードに適用されると読み込まれません。最後に印刷されます。これは明示的に行う必要があります。
-e
このオプションは、次の内容が現在のレコードに適用される有効なPerlコードであることをPerlに通知します。
--
=> Perlコマンドラインオプションの終わり、スイッチ(ダッシュで始まる)、ファイル順です。ファイル名がダッシュで始まる可能性がある場合は、./で始まり、フルパスまたは相対パスを指定するか、--
スイッチの終わりを示す別のパスを入力することをお勧めします。
今、algorithm
その部分は次のようになります。
my %h = reverse /^(([^:]+):. *)$/mg;
%
Perlでは、ハッシュまたは関連配列は名前の前のパーセンテージで識別されます。したがって、私たちの場合はハッシュを作成し%h
、その前にaを置きますmy
。つまり、次のレコードを読み込むたびにハッシュが語彙であり、if 範囲を終了することを意味します。これは、各レコードに対してまったく新しいハッシュが生成されることを意味します。
この表現は何を/..../mg
意味しますか?まず、すべての正規表現は常にif演算子を介していくつかのスカラー変数または式に関連付けられます=~
。しかし、ここでは一つも見えません。$_
現在のレコードを意味する変数に暗黙的にバインドされます。
続きます - -