首页 > 解决方案 > 从while循环读取文件没有得到第一行

问题描述

以下尝试从文件中读取,获取 CSV 的第二个字段,并在字段值大于为命令指定的第一个参数时执行操作:

while  read -r line
do
       var="$(cut -f2 -d,)" 
       #echo "$var"
       if [ "$var" -gt "$1" ]; then
         # do stuff
       fi

done < someFile

我遇到了两个问题:

  1. 循环不处理第一行。我是否缺少有关输入重定向如何工作的基本知识?或者它如何与while循环一起工作?

例如,如果someFile包含:

John,1,green
Bob,2,blue

评论的echo语句只会显示2

  1. 测试"$var" -gt "$1"产生错误integer expression expected

$1始终是一个数值。我尝试$var使用转换为整数,printf但我一直在阅读没有必要转换为整数,因为-gt隐式类型转换。

谢谢

标签: bash

解决方案


cut正在窃取您的数据。

$: cat in
x,1,x
x,2,x
x,3,x

$: while read line; do echo "[$line]"; cut -f 2 -d,  ; done < in
[x,1,x]
2
3

正在将read我的文件的第一行读入$line,我在方括号中回显,以便您看到它。然后cut处理文件的其余部分,因为两者都将其视为整个循环的标准输入。

您需要的是显式处理您已经读取的数据。

$: time while read line; do echo "[$line]"; val=$(cut -f 2 -d,<<<"$line"); echo "<$val>"; done < in
[x,1,x]
<1>
[x,2,x]
<2>
[x,3,x]
<3>

real    0m0.552s
user    0m0.106s
sys     0m0.401s

cut您可以通过跳过子进程并使用内置bash参数解析来使其更快/更高效。

$: time while read line; do echo "[$line]"; val="${line#*,}"; val="${val%%,*}"; echo "<$val>"; done < in
[x,1,x]
<1>
[x,2,x]
<2>
[x,3,x]
<3>

real    0m0.001s
user    0m0.000s
sys     0m0.000s

如果您没有明确的理由需要包含分隔符的整行,那么您只需要read.

$: time while IFS=, read v1 v2 v3; do echo "v1=$v1 v2=$v2 v3=$v3"; done < in
v1=x v2=1 v3=x
v1=x v2=2 v3=x
v1=x v2=3 v3=x

real    0m0.001s
user    0m0.000s
sys     0m0.000s

推荐阅读