私はスクリプティングに初めて触れており、次の要件があります。
次の内容を含む 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
答え2
$ paste jobname.txt value.txt |
awk '{printf "update_job: %s\nmax_run_alarm: %s\n\n", $1, $2}'
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
またはすべてawkで:
$ awk '
NR==FNR { jobs[NR]=$1; next }
{ printf "update_job: %s\nmax_run_alarm: %s\n\n", jobs[FNR], $1 }
' jobname.txt value.txt
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20
上記の両方は必須のPOSIXツールを使用しているため、すべてのUnixシステムのすべてのシェルで動作します。
答え3
そしてawk
:
awk '{printf "update_job: %s\n", $1 ; getline < "value.txt"; printf "max_run_alarm: %s\n\n", $1 }' jobname.txt
最初のprintf
コマンドは最初のファイルの行を印刷しますjobname.txt
。その後、getline
コマンドはファイルから行を取得しますvalue.txt
。その後、printf
コマンドはその行を印刷します。
バラよりhttp://awk.freeshell.org/AllAboutGetlineいつ、どのように使用するかをご覧くださいgetline
。
答え4
co=`awk 'END{print NR}' jobname.txt`
for ((i=1;i<=$co;i++)); do awk -v i="$i" 'NR==i{print "update_job: "$1}' jobname.txt; awk -v i="$i" 'NR==i{print "max_run_alarm: "$1}' value.txt;echo -e "\n"; done
出力
update_job: job1
max_run_alarm: 10
update_job: job2
max_run_alarm: 20