接続ガイドラインに関する質問

接続ガイドラインに関する質問

セミコロンで区切られたcsvファイルと、いくつかの洗練さを実行するKornシェルスクリプトがあります。 Korn シェルでは、次の 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」とは何ですか?

答え1

これら2つのコマンドを分析してみましょう。

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

複合コマンドは次のとおりです。 A | B | D

  • 答え:cat test.csvcatsファイルtest.csv(UUOC、「Useless Use Of Cat」とも呼ばれる)
  • B:wc -l行数は入力(stdin)から計算されます。ここにtest.csvの内容があります。したがって、「test.csv」の行数を計算します。 [...notetest.csvの最後の行に最後の「改行」がない場合、最後の行はカウントされません。...]
  • C::tr -d " " trは、wc -lが行番号の出力を埋めるために使用しているすべての「(スペース)を削除します。これにより、数字(および終了行改行)のみが維持されます。
  • 最後のD :: nawk '{printf("%0.6d\n", $1)'$1はawkの内側にあり、「現在行の最初のフィールド」を意味します。受信する各行に対して、この nawk は最初のフィールドのみを印刷し、数値で書式設定します。 INT(%d) で始まりますが、最低 6 桁になるように先頭にゼロを埋めます (ここでは「.」は無視されます)。 、私が知っている限り...カンマの後に6桁の浮動小数点数を出力する%0.6fと比較)

2行目:

num_rec=`expr $num_rec + 2 | nawk '{printf("%0.6d\n",  $1) }'`

数字に2を追加し(注:exprの場合、000008は大丈夫で「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は後で非常に慎重に処理する必要があります...)

答え2

90年代初頭以降、何も学んでいない、またはその時代のHOWTOに従う初心者が作成した命令です。次のように書くことをお勧めします。

num_rec=$(wc -l <test.csv)
num_rec=$(printf "%0.6d" $(( num_rec + 2 )) )

これは以下を使用します。コマンドの置き換えtest.cv使用された行数を取得します(ファイル名と行番号が印刷されないように wc -lリダイレクトして)。wc

その後、コマンド置換を再利用します。今回は、printfフォーマット文字列を使用して行数をゼロで埋め、固定幅が6ビットになり、シェル算術を使用して2を追加します$num_rec

$1元のコマンドでは、最初にawk入力されたフィールドを表します(この場合は行番号wc)。

関連情報