简短版本:如何在bash中创建一个循环,通过成对的行读取文件 log.dat ,将第二个比较为" 0.0",以防万一他们匹配输出另一个,否则第二个。
长版:我有一个包含对象位置的文本文件。位置由两种不同的方法确定,一种更精确和准确,但有时失败,另一种更稳健但不太准确。问题是,我希望尽量减少整个数据中的错误,并将我的脚本保存在bash中。
数据示例:
timestep1 alg2 15.326785087600001
timestep1 alg1 15.19699239146999
timestep2 alg2 0.0
timestep2 alg1 15.244353796926141
答案 0 :(得分:0)
您可以通过使用while-loop
和read
循环文件来实现此目的:
while IFS='' read -r ONE || [[ -n $ONE ]]; do
read -r TWO
if [[ $TWO == "0.0" ]]; then # string comparison, not numeric.
{ read -r THREE || [[ -n $THREE ]]; } && echo $THREE;
fi
done < "log.dat"
分解:
IFS=''
(或IFS=
)保留者通过read
读取每行中的前导/尾随空格。 (Bash通常将空格视为单词分隔符:这可以防止该行为)
-r
可防止反斜杠转义被解释
|| [[ -n $ONE ]]
会阻止输入文件中的最后一行被忽略,如果它不包含行结束字符,例如\n
或\c\r
:(读取返回遇到EOF时的非零退出代码。