AWKの配列にはコード記述が必要です。

AWKの配列にはコード記述が必要です。

私の使命は、元のデータのコードの1つが参照リストから読み取られた新しいコードに置き換えられるリストを作成することです。この場合、変更は1つだけですが、必要に応じて参照リストに追加することもできます。

参照リスト(mycodes)には次の値があります。

100,100007

データは3桁のコードのストリームですが、100のコードは残りのストリームと一緒に5桁のコードで記述する必要があります。以下のようにAWKプログラムを使用しました。

BEGIN{
FS=","
reffile="mycodes"
while(getline<reffile>0) {ref[$1]=$2}
}
{
val=$1
newval=ref[val]

if (newval in ref) { outval=val}
else               {outval=newval}

print outval
}

入力データファイルには次の値が含まれます。

100
101
120
130
100

プログラムの実行時に正しい出力を生成します。

100007
101
120
130
10007

ただし、参照ファイルの最初の項目の後にスペースがある場合にのみ機能します。空白がない場合、プログラムは 100007 以外の内容を出力として生成しません。

私はこのAWKプログラムのロジックで正確に何が起こっているのかわからず、誰かがそれを説明するのに役立つかもしれません。特にif (newval in ref)

ベストアンサー1

getline以下を使用してパディングを使用するには、$0次の方法を参照してください。http://awk.freeshell.org/AllAboutGetline):

while ( (getline < reffile) > 0 ) {
    ref[$1] = $2
}

スクリプトの残りの部分は1行だけで構成する必要があります。

{ print ( $1 in ref ? ref[$1] : $1 ) }

したがって、スクリプト全体は次のようになります。

BEGIN {
    FS = ","
    reffile = "mycodes"
    while ( (getline < reffile) > 0 ) {
        ref[$1] = $2
    }
}
{ print ( $1 in ref ? ref[$1] : $1 ) }

"mycodes"ファイル名を保持するために変数を作成し、それをパラメータとして渡したくない理由があるとします。

またはこれを行うこともできます:

BEGIN { FS = "," }
NR==FNR { ref[$1] = $2; next }
{ print ( $1 in ref ? ref[$1] : $1 ) }

そして電話してください。これはループを使用してパディングするよりも少し効率的ではありませんが、ほとんどawk 'script' mycodes fileのアプリケーションでは問題になる可能性がなく、明らかによりクリーンでエラーになりやすいコードを使用します。refs[]BEGINgetline

do は awk が現在のレコードを書き換えることを強制しないため、print ( $1 in ref ? ref[$1] : $1 )do または類似のものよりも効率的ですが、やはりif ($1 in ref) $1=ref; print $1言葉ではありません。

問題はありますが、既存のスクリプトは説明したように失敗しない可能性があり、実際の問題はDOS行の終わりです(参照)https://stackoverflow.com/questions/45772525/why-does-my-tool-output-overwrite-itself-and-how-do-i-fix-it?)。

おすすめ記事