当像awk这样的程序通过管道获取输入时,它是否通过ine读取它?

THI*_*ELP 0 unix bash awk

所以我通常以形式执行unix任务,cat text.csv | awk '{print $1}'输出是由换行符分隔的结果.我想知道因为cat输出csv文件(我假设它是线性完成的),awk也逐行处理输出,线性执行.我觉得这显然是正确的,但考虑到如何将bash命令应用于多个项目,我想知道bash是否处理这些命令的方式与逐行读取不同.

例如,我有两种编写代码的方法:

while IFS=, read a b c
    echo $a $b $c
done < textfile.txt
Run Code Online (Sandbox Code Playgroud)

要么

cat textfile.txt | awk '{print $1 $2 $3}'
Run Code Online (Sandbox Code Playgroud)

它们在运行时间或处理数据方面有所不同吗?

Sob*_*que 5

它完全取决于"读取"管道,它如何处理它.默认情况下,大多数使用\n作为他们的"记录分隔符",所以通过线工作线.

这是可选的,但在大多数情况下都适用.管道本身没有任何记录分隔符的概念 - 你可以发送你喜欢的任何东西 - 甚至是原始的二进制内容.

例如

tar cvf - . | gzip -c | ssh $somehost "cat > file.tgz"
Run Code Online (Sandbox Code Playgroud)

编辑:根据您的更新:

你编写代码的方式并不重要.使其清晰,干净,优雅,不必担心效率,直到必要.这通常是永远的,所以花在优化上的任何时间都是浪费时间.

比起其他任何东西花费更多时间的事情是将数据从磁盘上流出 - 通常,无论如何.你不能让它更快,所以大多数 - 没有必要担心.

"过早的优化是所有邪恶的根源" - 唐纳德克努特

所以写清楚代码,首先是最重要的.如果你真的需要担心性能,请对其进行分析并集中精力(并且可能不使用shell)