使用tail -n读取行时如何使用

3ks*_*stc 3 csv bash tail while-loop

问题:我有一个 CSV 转储文件 - 超过 250,000 行。当我使用时while read- 需要一段时间(没有双关语)。我想回到最后 10,000 行来做我需要做的事情,而不是 250,000 行。

代码片段:我当前的代码是这样的:

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
Run Code Online (Sandbox Code Playgroud)

问题:在阅读with bash 脚本时如何使用tail -n10000with ?while read linefile_in_question.csv

Joh*_*024 5

代替:

done </some_directory/directory/file_in_question.csv
Run Code Online (Sandbox Code Playgroud)

和:

done < <(tail -n10000 /some_directory/directory/file_in_question.csv)
Run Code Online (Sandbox Code Playgroud)

<(...)构造称为进程替换。它创建了一个类似文件的对象,bash 可以从中读取。因此,这将some_directory/directory/file_in_question.csv直接从读取替换为从读取tail -n10000 /some_directory/directory/file_in_question.csv

使用这样的进程替换允许您将while循环保留在主 shell 中,而不是子 shell 中。因此,您在while循环中创建的变量将在循环退出后保留其值。

加速原始代码

所示代码打印 CSV 文件的第二列。如果这就是代码应该做的所有事情,那么它可以替换为:

awk -F, '{print $2}' /some_directory/directory/file_in_question.csv
Run Code Online (Sandbox Code Playgroud)