sed -n 函数在同一行中重复调用

sed -n 函数在同一行中重复调用

我是一个关于 unix 和编写 shell 脚本的完全新手,所以如果我的问题的解决方案相当平庸,我深表歉意。

但本质上,我的 shell 脚本“run.x”正在重复读取相同的初始条件,而它每次应该读取不同的初始条件。有问题的代码在这里,我认为问题出在 sed 上:

运行.x:

./sursec.x < ./sursecout.txt
sed -n '1,2p;3q' sursecout.txt
cd ..
mv ./data ./CJ=3.029990
mkdir data
cd SurSec
./sursec.x < ./sursecout.txt
sed -n '3,4p;5q' sursecout.txt
cd ..
mv ./data ./CJ=3.030659
mkdir data
cd SurSec

因此,上面每个代码块的前两行应该从以下两行中读取:

sursecout.txt:

3.029990d0
0.81476d0
3.030659d0
0.81476d0

上述代码的第一部分应分别读取 3.029990d0、0.81476d0,下一部分应分别读取 3.030659d0、0.81476d0。这些是我的初始条件,取自 sursecout.txt,并通过名为 sursec.x 的单独脚本运行。然后,每个进程都会创建一个文件夹“CJ = ...”,并在其中存储十个输出文本文件。我的 shell 脚本总共运行了 30 个这样的进程。我的问题是,我得到 30 个文件夹,每个文件夹都有正确的 CJ 值,但每个文件夹中都有完全相同的一组 10 个输出文件。我的 shell 脚本似乎重复了 30 次相同的过程,但将它们存储在不同的文件夹中。

答案1

据我所知,您希望将数据文件中的每对行读入sursec.x,然后data使用近似于两行的第一个值的名称保存结果目录。

while IFS= read -r line1 && IFS= read -r line2          # Read two lines from the datafile
do
    mkdir -p ../data                                    # Create data directory (if necessary)
    printf "%s\n%s\n" "$line1" "$line2" | ./sursec.x    # Feed the two lines to sursec
    target="CJ=${line1%d0}"                             # Prefix "CJ=" and strip trailing "d0"
    mv ../data ../"$target"                             # Rename "data" as "$target"
done < sursecout.txt

您自己的代码不起作用的原因是您从未修改过源数据文件,因此程序sursec.x始终给出相同的前两行。

我有点困惑为什么sursec.x程序应该在父目录中创建其数据文件,但由于这就是您的示例代码的作用,因此我的代码在这里也是如此假设的。

相关内容