问题:我有一个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
问题:在使用bash脚本阅读tail -n10000
时如何将while read line
与file_in_question.csv
一起使用?
答案 0 :(得分:3)
替换:
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
循环保留在主shell中,而不是子shell。因此,在while
循环中创建的变量将在循环退出后保留其值。
显示的代码打印CSV文件的第二列。如果这就是代码应该做的全部,那么它可以替换为:
awk -F, '{print $2}' /some_directory/directory/file_in_question.csv
答案 1 :(得分:1)
类似的东西:
IFS=","
tail /var/log/httpd/error_log | while read foo bar
do
echo $foo
done
我建议您使用read
进行bash拆分,而不是在那里低效调用awk
。显然,将整个内容重写为awk脚本将比shell更快,但是awk更难用于普通语言。
答案 2 :(得分:0)
或者这个。
while :
do read l || { sleep 1 ; continue; }
echo "==> $l"
done < /var/log/httpd/error_log