1. ホーム
  2. bash

[解決済み] tail -nでwhile read lineを使用する方法

2022-03-15 09:47:05

質問

問題あり。 250,000行を超えるCSVダンプファイルがあります。このファイルに対して while read - 時間がかかります(ダジャレではありません)。25万行ではなく、最後の1万行まで戻って必要なことをしたいのですが。

コードスニペットです。 現在の私のコードはこれです。

IFS=","
while read line
do

    awk_var=`echo "$line" | awk -F" " '{print $0}'`

    var_array=($awk_var)

    read -a var_array <<< "${awk_var}"

    echo "${var_array[1]}"


done </some_directory/directory/file_in_question.csv

質問です。 を使用するにはどうすればよいですか? tail -n10000while read line を読むと file_in_question.csv をbashスクリプトで実行しますか?

解決方法は?

置き換える。

done </some_directory/directory/file_in_question.csv

を使っています。

done < <(tail -n10000 /some_directory/directory/file_in_question.csv)

<(...) という構文があります。 プロセス代替 . これは、bashが読み取ることができるファイルのようなオブジェクトを作成します。 したがって、これは some_directory/directory/file_in_question.csv を直接読み取るのではなく tail -n10000 /some_directory/directory/file_in_question.csv .

このようにプロセス置換を使用することで、あなたの while ループをサブシェルではなく、メインシェルで実行します。 このため、サブシェルで作成した変数は while ループが終了した後も、その値は保持されます。

オリジナルコードの高速化

このコードは、CSVファイルの2列目を印刷するものです。 もし、このコードでできることがこれだけなら、次のように置き換えることができます。

awk -F, '{print $2}' /some_directory/directory/file_in_question.csv