ファイルの最初の2行をコピーしてこの行を削除してください。

ファイルの最初の2行をコピーしてこの行を削除してください。

シェルスクリプトを使用してファイルを処理する必要があります。ファイルには、データとファイルの処理方法に関するいくつかの情報が含まれています。ファイルの形式は次のとおりです。

  • メールアドレス
  • システム領域
  • 品目番号
  • 品目番号
  • 品目番号
  • 品目番号
  • など...

email_addressはファイルの送信が完了したことをユーザーに知らせるために必要であり、system_areaはロードプロセスがファイルをロードする場所を示します。そのため、これら2つの値をスクリプトで使用する変数に入れました。私は現在3つのsedコマンドを使用して情報を取得し、その行を削除しています。

var1=$(sed -n '1p' infile)
var2=$(sed -n '2p' infile)
sed -i '1,2d' infile

上記のコードはうまくいきますが、「不正」で非効率的であると考えられています。同じ目標をよりエレガントで効率的に達成する方法を知っている人はいますか?

答え1

あなたのコードは大丈夫です。おそらく簡単な修正でこれを行います。印刷後すぐにsedを終了する方が効率的です。sed -n '1{p;q}'何の理由もなくファイル全体を読まないでください。

今、最も厄介なのは、最初の2行を得るためにファイルを2回読み取ることです。単にシェル組み込みコマンドを使用できます。

{ read -r var1; read -r var2; } < infile

その後、維持するか、sed -i '1,2d'単に使用してくださいtail -n +3 > outfile; mv outfile infile

一度にこれを行う究極の方法は、2つの変数を読み取り、read残りをキャプチャすることです。

{ read -r var1; read -r var2; cat; } < infile > outfile

出力を別のファイルに保存しました(その後、再度コピーできます)。これは内部修正を使用するのと同じくらい「エレガント」ではありませんが、sedより安全で同じ量のコードを作成します。最後のバージョンでは、ファイルを3回読み取るのではなく、1回だけ読み込みます。

答え2

私の考えでは、var1同じvar2価値を得るでしょう。

私は使用します

 var1=$(awk 'NR==1' infile)
 var2=$(awk 'NR==2' infile)
 sed -i '1,2d' infile

どこ

  • NRレコード数、つまり行番号を表す awk 変数。
  • NR==1行1を選択してください。
  • デフォルトのawk操作は、行全体を印刷することです。

関連情報