这是我的第一篇文章,所以希望我能清楚地表达我的问题。
我是shell脚本的新手,我的任务是为csv文件的每一行添加一个新值。需要添加的值基于文件名的前3位数。
我有点背景。我收到的csv文件最终被加载到分区的oracle表中。文件名的开头(例如BATTESTFILE.txt)包含分区的站点,因此我需要编写一个脚本,该脚本采用文件名的前3个字符(在本例中为BAT)并将其添加到文件的每一行的末尾
我到目前为止最接近的是当我将代码剥离到我需要做的基本知识时:
build_files()
{
OLDFILE=${filename[@]}.txt
NEWFILE=${filename[@]}.NEW.txt
ABSOLUTE='path/scripts/'
FULLOLD=$ABSOLUTE$OLDFILE
FULLNEW=$ABSOLUTE$NEWFILE
sed -e s/$/",${j}"/ "${FULLOLD}" > "${FULLNEW}"
}
set -A site 'BAT'
set -A filename 'BATTESTFILE'
for j in ${site[@]}; do
for i in ${filename[@]}; do
build_files ${j}
done
done
我在这里设置了一个数组site
,因为会有6个网站'这将使文件传递给我时,可以很容易地将代码添加到代码中。 filename
数组也是如此。
此代码有效,但它并不像我需要的那样自动化。我最近的尝试之一是:
build_files()
{
OLDFILE=${filename[@]}.txt
NEWFILE=${filename[@]}.NEW.txt
ABSOLUTE='/app/dss/dsssis/sis/scripts/'
FULLOLD=$ABSOLUTE$OLDFILE
FULLNEW=$ABSOLUTE$NEWFILE
sed -e s/$/",${j}"/ "${FULLOLD}" > "${FULLNEW}"
}
set -A site 'BAT'
set -A filename 'BATTESTFILE'
for j in ${site[@]}; do
for i in ${filename[@]}; do
trust=echo "$filename" | cut -c1-3
echo "$trust"
if ["$trust" = 'BAT']; then
${j} = 'BAT'
fi
build_files ${j}
done
done
我在研究时通过StackOverflow上的另一个问题找到了代码trust=echo "$filename" | cut -c1-3
,但它似乎并不适合我。我添加了echo
来测试trust
持有的内容,但它是空的。
我收到2个错误: 第17行 - BATTESTFILE:未找到 第19行 - 测试:]缺失
很抱歉这个冗长的问题。希望它包含有用的信息,并显示我采取的步骤。任何问题,评论。非常感谢任何帮助或指导。感谢。
答案 0 :(得分:0)
当你是shell的新手时,请尝试避免使用数组 在if语句中,在[和]字符之前和之后使用空格。 习惯用{}之类的$ {trust}
来包围你的shell变量我不知道你是如何填充数组的,当阵列被硬编码时,请尝试替换 SITE =文件1 SITE =" $ {SITE} file2"
你必须告诉unix你想让右边的东西与$(..)相比(优于背景):
trust=$(echo "${filename}" | cut -c1-3)
可以在Google
找到一些指南和语法帮助答案 1 :(得分:0)
只需使用shell parameter expansion:
$ var=abcdefg
$ echo "${var:0:3}"
abc
假设您正在使用像bash或ksh这样功能强大的shell,例如
答案 2 :(得分:0)
以防万一现在或将来对其他人都有用,我使用下面的代码让我的代码按照需要运行。感谢下面的Walter A回答我从文件名中获取前3个字符并将它们用作变量的主要问题。
这为我提供了获取文件名的前3个字符所需的输出,并将它们添加到我的csv文件中每行的末尾。
## Get the current Directory and file name, create a new file name
build_files()
{
OLDFILE=${i}.txt
NEWFILE=${i}.NEW.txt
ABSOLUTE='/app/dss/dsssis/sis/scripts/'
FULLOLD=$ABSOLUTE$OLDFILE
FULLNEW=$ABSOLUTE$NEWFILE
## Take the 3 characters from the filename and
## add them onto the end of each line in the csv file.
sed -e s/$/";${j}"/ "${FULLOLD}" > "${FULLNEW}"
}
## Loop to take the first 3 characters from the file names held in
## an array to be added into the new file above
set -A filename 'BATTESTFILE'
for i in ${filename[@]}; do
trust=$(echo "${i}" | cut -c1-3)
echo "${trust}"
j="${trust}"
echo "${i} ${j}"
build_files ${i} ${j}
done
希望这对其他人有用。