将单个文件中的相邻行与 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-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
读取的每一行中保留 leading/trailing 空格。 (Bash 通常将空格视为单词分隔符:这可以防止这种行为)
-r
防止反斜杠转义被解释
|| [[ -n $ONE ]]
防止输入文件中的最后一行在不包含行结束字符(例如 \n
或 \c\r
时被忽略: (读取returns遇到EOF时的非零退出码).
简短版:如何在 bash 中创建一个循环,通过成对的行读取文件 log.dat,将第二行与“0.0 ",如果它们匹配输出另一个,否则输出第二个。
长版本:我有一个包含对象位置的文本文件。位置由两种不同的方法确定,一种更精确和准确,但有时会失败,另一种更稳健但不太准确。问题是,我想尽量减少整个数据中的错误并将我的脚本保持在 bash 中。
数据示例:
timestep1 alg2 15.326785087600001
timestep1 alg1 15.19699239146999
timestep2 alg2 0.0
timestep2 alg1 15.244353796926141
您可以通过使用 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
读取的每一行中保留 leading/trailing 空格。 (Bash 通常将空格视为单词分隔符:这可以防止这种行为)-r
防止反斜杠转义被解释|| [[ -n $ONE ]]
防止输入文件中的最后一行在不包含行结束字符(例如\n
或\c\r
时被忽略: (读取returns遇到EOF时的非零退出码).