セミコロンで区切られたcsvファイルといくつかの詳細を行うKornシェルスクリプトがあります。 KornShellでこれら2つの手順が何をするのかを理解しようとしています。
num_rec=`cat test.csv |wc -l|tr -d " " | nawk '{printf("%0.6d\n", $1) }'`
num_rec=`expr $num_rec + 2 | nawk '{printf("%0.6d\n", $1) }'`
それらは連結を使用する2つの命令のようですが、最終的な結果は何ですか? nawkコマンドの「$ 1」とは何ですか?
両方のコマンドを分解してみましょう
_num_rec=`cat test.csv |wc -l|tr -d " " | nawk '{printf("%0.6d\n", $1) }'`
_
複合コマンドです:A | B | C | D
cat test.csv
_は、ファイルtest.csvをキャットするだけです(UUOC、「猫の役に立たない使用」でもあります)wc -l
_は、入力(stdin)からの行数をカウントします。これはここではtest.csvのコンテンツです。したがって、「test.csv」の行数がカウントされます[...注意test.csvの最後の行に最後の「改行」がない場合、その最後の行はカウントされません。 ..]tr -d " "
_:trは、 ""(スペース)が出現するたびに削除します。これは、wc-lが行番号の出力を埋めるために使用します。これにより、番号(および改行の終了)のみが残るようになりますnawk '{printf("%0.6d\n", $1)'
:ここで$ 1はawk内にあり、「現在の行の最初のフィールド」を意味します。このnawkは、受信する行ごとに、最初のフィールドのみを出力し、数値でフォーマットします:INT(%d)として、ただし、最初に0を埋めて、少なくとも6桁にします(ここでの「。」は無視されます)。 、私が知る限り...コンマの後に6桁の浮動小数点数を出力する%0.6fと比較してください)2行目:
_num_rec=`expr $num_rec + 2 | nawk '{printf("%0.6d\n", $1) }'`
_
数値に2を加算するだけで(注:000008はexprで問題なく、「8」と見なされますが、シェルでは間違った8進数と見なされます)、同じ方法で再度フォーマットします。
これはすべて次のように減らすことができます:
_num_rec=$(printf "%0.6d\n" "$(( $(wc -l < test.csv) + 2 ))")
_
つまり、これは次のことです。csvの行数を数え(行の内容に関係なく...)、2を加算し、結果を「num_rec」に入れ、その前に「0」を付けて少なくとも6桁。
例:32行のtest.csvファイルはnum_recに配置されます:_000034
_
(警告:シェルの0nnnnは8進数と見なされることが多いため、$ num_recは後で細心の注意を払って処理する必要があります...)
これらは、90年代初頭から何も学んでいないか、その時代のHOWTOをフォローしている初心者によって書かれたコマンドです。次のように書く方がよいでしょう:
_num_rec=$(wc -l <test.csv)
num_rec=$(printf "%0.6d" $(( num_rec + 2 )) )
_
これは コマンド置換 を使用して_test.cv
_を使用して_wc -l
_から行数を取得します(リダイレクトによって、wc
がファイル名を行と一緒に出力しないようにしますカウント)。
次に、コマンド置換を再度使用します。今回はprintf
とフォーマット文字列を使用して、行数をゼロで埋め、6桁の固定幅にし、シェル演算で_$num_rec
_に2を追加します。 。
元のawk
コマンドの_$1
_は、入力の最初のフィールドを参照していました(この場合、wc
からの行数)