将单个文件中的相邻行与 bash 进行比较

comparing adjacent lines in a single file with bash

简短版:如何在 bash 中创建一个循环,通过成对的行读取文件 log.dat,将第二行与“0.0 ",如果它们匹配输出另一个,否则输出第二个。

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

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

您可以通过使用 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 读取的每一行中保留 leading/trailing 空格。 (Bash 通常将空格视为单词分隔符:这可以防止这种行为)

  • -r 防止反斜杠转义被解释

  • || [[ -n $ONE ]] 防止输入文件中的最后一行在不包含行结束字符(例如 \n\c\r 时被忽略: (读取returns遇到EOF时的非零退出码).