2つのファイル間のマッピング

2つのファイル間のマッピング

私はスクリプティングに初めて触れており、次の要件があります。

次の内容を含む jobname.txt というファイルがあります。

job1
job2

以下の内容を含むvalue.txtというファイルがあります。

10
20

次のように出力を印刷する必要があります。

update_job: job1
max_run_alarm: 10

update_job: job2
max_run_alarm: 20

シェルスクリプトまたはawkを使用してこれをどのように実行できますか?

ベストアンサー1

paste+によってawk

$ paste -d'\n' jobname.txt value.txt \
  |awk '{ print (NR%2?"update_job:":"max_run_alarm:", $0) }'

デフォルトでは、名前が示すようpasteに、2つのファイルを1行ずつ貼り付けますが、各行の\n間に改行文字を追加してから、前の出力を再処理してawk必要な内容を前に追加します。「テキスト」行番号がモジュロ2の行(偶数行番号を持つ行、たとえば行番号2、4、6...)の場合、NR行番号には次の行が含まれます。アッ処理のために読む必要があります)テキストの前に「ジョブの更新:「または奇数行番号の場合は、前にテキストを追加します。」最大動作警告:「、その後、行自体を印刷します$0

ただawk:

awk 'NR==FNR{ 
    getline val<ARGV[2]; print "update_job:", $0 ORS "max_run_alarm:", val; next
}
{ exit }' jobname.txt value.txt

上記では、NRが行番号であると述べた。ここでは、FNRとFNRは常に同じ値を持ちます(つまり、両方とも行番号を含みます)、NRはすべての入力ファイル内のすべての行に対して増加したままです。次の入力ファイルが読み込まれると(存在する場合)、再び1にリセットされるため、次のNR==FNRコードブロックが最初の入力ファイルに対してのみ実行されるようにします。

では、「getlineファイルから変数への変換「私たちが入力として渡した2番目の引数から1行を読みます(ここではARGV[2]return value.txt)を入力して変数に保存すると、val残りの部分は印刷するだけです。 ORSはそれぞれの間に改行文字を印刷します。

それともこれを好むかもしれません(しかし私はファイル名をハードコードするのが好きではありません)。

awk '{ 
    getline val<"value.txt"; print "update_job:", $0 ORS "max_run_alarm:", val
}' jobname.txt

おすすめ記事