簡體   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