シェルスクリプトを使用してファイルを処理する必要があります。ファイルには、データとファイルの処理方法に関するいくつかの情報が含まれています。ファイルの形式は次のとおりです。
- メールアドレス
- システム領域
- 品目番号
- 品目番号
- 品目番号
- 品目番号
- など...
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操作は、行全体を印刷することです。