私の使命は、元のデータのコードの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[]
BEGIN
getline
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?)。