[英]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行。 最简单的方法可能是使用head
和tail
。
$ 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.