我希望使用shell脚本和sed在我的结果txt文件中放入一些数字,比如:
for i in 0.88 0.90 0.92 0.94 0.96 0.98 1.00 1.02 1.04 1.06 1.08 1.10 1.12; do
a_original_A=5
amod=`bc <<< "$i*$a_original_A"`
sed -s -i '1i|/"list_number_$i $amod $amod $amod 90 90 90" ' list_${i}.txt
sed -s -i '1i12' list_${i}.txt
done
但它没有起作用。我试着在逃跑时使用sed,但失败了;我试过
sed -s -i '1i|/"list_number_$i ${amod} ${amod} ${amod} 90 90 90" ' list_${i}.txt
但这也于事无补。
在这里,我希望制作13个数量的txt文件,并希望在13个txt文件的第二行放上变化的数字。例如,list_0.88.txt包含
12
list_number_0.88 4.4 4.4 4.4 90 90 90
文件开头的那两行。4.4来自5*0.88。同样,我希望制作13个文件,在第二行有不同的编号。如何在sed命令中使用数字?
注意:已经有13个非空文本文件;我希望添加这些新行作为每个现有文件的前两行。
你到底在做什么,试图使用shell加sed加bc来实现这一点???通用的UNIX文本操作工具是awk:
awk 'BEGIN {
a_original_A = 5
split("0.88 0.90 0.92 0.94 0.96 0.98 1.00 1.02 1.04 1.06 1.08 1.10 1.12",nums)
for (i in nums) {
num = nums[i]
out = "list_" num ".txt"
amod = num * a_original_A
print "12" > out
print "list_number_" num, amod, amod, amod, 90, 90, 90" > out
close(out)
}
}'
请在下面写下您的评论,如果您的目录中已经有文件,那么使用GNU awk(我认为您在示例中使用GNU sed后已经有了),它将是:
awk -i inplace '
BEGIN { a_original_A = 5 }
FNR==1 {
num = gensub(/.*_/,"",1,FILENAME)
amod = num * a_original_A
print "12"
print "list_number_" num, amod, amod, amod, 90, 90, 90"
}
{ print }
' list_*.txt
首先,您有"list_0.88.txt,list_0.90.txt…",依此类推,对吗?如你所愿,我认为我们可以这样修改外壳:
#!/bin/bash
for i in "0.88 0.90 0.92 0.94 0.96 0.98 1.00 1.02 1.04 1.06 1.08 1.10 1.12"
do
a_original_A=5
amod=`bc <<< "$i*$a_original_A"`
echo "---->$amod"
echo "12" > /tmp/tmpfile
echo "list_number_$i $amod $amod $amod 90 90 90" >> /tmp/tmpfile
cat list_${i} >> /tmp/tmpfile
cp -rf list_${i}.txt list_${i}.txt.bak
cp -rf /tmp/tmpfile list_${i}.txt
done
有很多可能的方法。此代码使用seq
命令生成数字范围。它分为三部分。第一部分创建"预先存在"的文件。
第二部分展示了编辑文件的两种方法。带有行(标记)12A
的版本不需要sed
对-i
的支持(它不是标准的,GNU sed
的行为与BSD(Mac OS X)sed
的行为不同)。带有行(标记)12B
的版本使用经典的sed
表示法(与GNU sed
和其他变体一起使用)在文件中原始文本的第1行之前插入两行信息。
# Generate 'pre-existing' files
for number in $(seq -f '%4.2f' 0.88 0.02 1.12)
do echo "Pre-existing data in file $number" > list_$number.txt
done
tmp=$(mktemp ./tmp.XXXXXX)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
for number in $(seq -f '%4.2f' 0.88 0.02 1.12)
do
list="list_$number.txt"
# Works without using sed
{
echo "12A"
echo "$number" | awk '{ x=5*$1; printf("list_number_%4.2f %4.1f %4.1f %4.1f 90 90 90n", $1, x, x, x) }'
cat "$list"
} > "$tmp"
cp "$tmp" "$list"
rm -f "$tmp"
# Option 2 (as written, works with GNU sed and BSD sed)
amod=$(echo "$number" | awk '{printf "%4.1fn", 5*$1}')
sed -i.bak -e "1i\
12B\
list_number_$number $amod $amod $amod 90 90 90" "$list"
done
trap 0 1 2 3 13 15
样本输出(cat list_1.1?.txt
):
12B
list_number_1.10 5.5 5.5 5.5 90 90 90
12A
list_number_1.10 5.5 5.5 5.5 90 90 90
Pre-existing data in file 1.10
12B
list_number_1.12 5.6 5.6 5.6 90 90 90
12A
list_number_1.12 5.6 5.6 5.6 90 90 90
Pre-existing data in file 1.12
显然,该代码假设您有seq
,但它可以作为GNU CoreUtils的一部分在Mac OS X上使用。
另一种技术:
# Generate pre-existing files as before
for number in $(seq -f '%4.2f' 0.88 0.02 1.12)
do echo "Pre-existing data in file $number" > list_$number.txt
done
# Generate the two parameters from awk; use sed to edit each file in turn.
awk 'BEGIN { for (i = 0.88; i <= 1.12; i += 0.02) printf "%4.2f %4.1fn", i, 5*i }' |
while read number amod
do
list="list_$number.txt"
sed -i.bak -e "1i\
12\
list_number_$number $amod $amod $amod 90 90 90" "$list"
done
样本输出(cat list_1.1?.txt
):
12
list_number_1.10 5.5 5.5 5.5 90 90 90
Pre-existing data in file 1.10
12
list_number_1.12 5.6 5.6 5.6 90 90 90
Pre-existing data in file 1.12