繁体   English   中英

将输入传递给sed,并将sed信息传递给字符串

[英]Passing input to sed, and sed info to a string

我有一个文件列表(〜1000),并且我的文本文件中每行有1个文件,名为:“ files.txt”

我有一个看起来像以下内容的宏:

#!/bin/sh
b=$(sed '${1}q;d' files.txt)

cat > MyMacro_${1}.C << +EOF

myFile = new TFile("/MYPATHNAME/$b");

+EOF

我通过使用这个输入脚本

./MakeMacro.sh 1

然后我想做

./MakeMacro.sh 2
./MakeMacro.sh 3

...等等

这样它将读取我的files.txt的第n行并将该字符串提供给我创建的.C宏。

如果我对您的理解正确,则可以在bash中执行for循环以使用不同的参数多次调用脚本。

for i in `seq 1 n`; do ./MakeMacro.sh $i; done

根据OP的评论,看来他想将生成的文件提交给Condor。 您可以修改上面的循环以包括秃鹰提交。

for i in `seq 1 n`; do ./MakeMacro.sh $i; condor_submit <OutputFile> ; done
i=0
while read file
do
    ((i++))
    cat > MyMacro_${i}.C <<-'EOF'

    myFile = new TFile("$file");

    EOF
done < files.txt

当心:您需要在EOF行上使用制表符缩进。

我很困惑为什么这是您想要完成这项工作的方式。 您可以让C ++代码在运行时读取files.txt ,并且在大多数情况下它可能更有效率。

如果要将files.txt的第N行插入MyMacro_N.C ,则:

{
echo
sed -n -e "${1}{s/.*/myFile = new TFILE(\"&\");/p;q;}" files.txt
echo
} > MyMacro_${1}.C

这样它将读取我的files.txt的第n行并将该字符串提供给我创建的.C宏。

给定此语句和您的标记,我将使用外壳工具进行回答,而不会真正解决.c宏的问题。

脚本的第一行包含sed脚本。 有很多方法可以从文本文件获取第N行。 最简单的方法可能是使用headtail

$ head -n "${i}" files.txt | tail -n 1

这将使用files.txt的前$i行,并向您显示该集合的后1行。

$ sed -ne "${i}p" files.txt

sed的这种用法在默认情况下避免使用-n进行打印,然后打印$i th行。 为了获得更好的性能,请尝试:

$ sed -ne "${i}{p;q;}" files.txt

这样做相同,但是在打印该行后退出,因此sed不会遍历文件的其余部分。

$ awk -v i="$i" 'NR==i' files.txt

这会将shell变量$i传递给awk,然后评估一个表达式,该表达式测试处理的记录数是否与该变量相同。 如果表达式的计算结果为true,则awk打印该行。 为了获得更好的性能,请尝试:

$ awk -v i="$i" 'NR==i{print;exit}' files.txt

像上面的第二个sed脚本一样,这将在打印行后退出,以避免遍历文件的其余部分。

您也可以通过将文件加载到数组中的多种方式来执行此操作,但是这些方式会占用更多内存,并且性能会降低。 如果可以的话,我会使用单线。 :)

要采用以下任何一种方法并将其放入脚本中,您已经有了标记:

if expr "$i" : '[0-9][0-9]*$' >/dev/null; then
    b=$(sed -ne "${i}{p;q;}" files.txt)
else
    echo "ERROR: invalid line number" >&2; exit 1
fi

真是的 整个脚本应该只是(未试用):

awk -v nr="$1" 'NR==nr{printf "\nmyFile = new TFile(\"/MYPATHNAME/%s\");\n\n",$0 > ("MyMacro_"nr".C")}' files.txt

如果性能是一个问题,可以在}之前加上;exit ,但我怀疑是否会出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM