使用bash比较单个文件中的相邻行

时间:2017-07-28 20:00:28

标签: bash file lines

简短版本:如何在bash中创建一个循环,通过成对的行读取文件 log.dat ,将第二个比较为" 0.0",以防万一他们匹配输出另一个,否则第二个。

长版:我有一个包含对象位置的文本文件。位置由两种不同的方法确定,一种更精确和准确,但有时失败,另一种更稳健但不太准确。问题是,我希望尽量减少整个数据中的错误,并将我的脚本保存在bash中。

数据示例:
timestep1 alg2 15.326785087600001
timestep1 alg1 15.19699239146999
timestep2 alg2 0.0
timestep2 alg1 15.244353796926141

1 个答案:

答案 0 :(得分:0)

您可以通过使用while-loopread循环文件来实现此目的:

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时的非零退出代码。