web-dev-qa-db-ja.com

連結命令に関する質問

セミコロンで区切られた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」とは何ですか?

3
Micheal Bolton

両方のコマンドを分解してみましょう

_num_rec=`cat test.csv |wc -l|tr -d " " | nawk '{printf("%0.6d\n",  $1) }'`
_

複合コマンドです:A | B | C | D

  • A:_cat test.csv_は、ファイルtest.csvをキャットするだけです(UUOC、「猫の役に立たない使用」でもあります)
  • B:_wc -l_は、入力(stdin)からの行数をカウントします。これはここではtest.csvのコンテンツです。したがって、「test.csv」の行数がカウントされます[...注意test.csvの最後の行に最後の「改行」がない場合、その最後の行はカウントされません。 ..]
  • C:_tr -d " "_:trは、 ""(スペース)が出現するたびに削除します。これは、wc-lが行番号の出力を埋めるために使用します。これにより、番号(および改行の終了)のみが残るようになります
  • 最後のD: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は後で細心の注意を払って処理する必要があります...)

3
Olivier Dulac

これらは、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からの行数)

0
cas