bash - 从while循环读取文件没有得到第一行
问题描述
以下尝试从文件中读取,获取 CSV 的第二个字段,并在字段值大于为命令指定的第一个参数时执行操作:
while read -r line
do
var="$(cut -f2 -d,)"
#echo "$var"
if [ "$var" -gt "$1" ]; then
# do stuff
fi
done < someFile
我遇到了两个问题:
- 循环不处理第一行。我是否缺少有关输入重定向如何工作的基本知识?或者它如何与while循环一起工作?
例如,如果someFile
包含:
John,1,green
Bob,2,blue
评论的echo
语句只会显示2
- 测试
"$var" -gt "$1"
产生错误integer expression expected
。
$1
始终是一个数值。我尝试$var
使用转换为整数,printf
但我一直在阅读没有必要转换为整数,因为-gt
隐式类型转换。
谢谢
解决方案
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
推荐阅读
- r - 错误的观察次数 - nobs
- c# - 检测到 Newtonsoft.Json 的版本冲突。直接安装/引用 Newtonsoft.Json 11.0.2(Azure 函数视觉工作室)
- ssh - Alexa 开发人员控制台端点错误
- asp.net - 如何允许我的 Azure Web 应用程序访问 Active Directory?
- python - 每隔几分钟自动执行 CMD 命令的 Python 程序
- lua - 有没有办法使用 Lua 的 Busted 测试框架设置看门狗计时器?
- visual-studio-code - 如何让 VSCode 在其他目录中查找
- jakarta-ee - Websphere 8.5 会话死锁
- c++ - GCC/CLang 不同意模板模板参数的部分特化
- ui-automation - WPF 控件的可见性参数在 UI 自动化中不可见?