2015-02-09 82 views
0

这是我的第一篇文章,希望能够让我的问题变得清晰。使用文件名的前3个字符作为shell脚本中的变量

我是shell脚本的新手,我的任务是为csv文件的每一行添加一个新值。需要添加的值基于文件名的前三位数字。

我有点背景。我收到的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 

我发现的代码trust=echo "$filename" | cut -c1-3通过在计算器上另外一个问题,因为我是研究,但似乎并没有为我工作。我在echo中加入了测试什么trust持有,但​​它是空的。

我得到2个错误回:17 线 - BATTESTFILE:找不到 线19 - 测试:]缺少

对不起,长篇大论的问题。希望它包含有用的信息并显示我已采取的步骤。有任何问题,请发表评论。任何帮助或指导,非常感谢。谢谢。

+0

您使用的是哪个外壳?看起来像ksh。哪个版本?试试'ksh --version' – 2015-02-09 15:03:45

回答

0

当你使用shell时,尝试避免使用数组。
在if语句中使用[和]字符前后的空格。 习惯于用{}周围像$你的shell变量{信赖}

我不知道你是怎么填写您的阵列,当阵列是硬编码,尝试TE与 SITE =文件1 SITE取代=“$ { SITE}文件2"

而且你必须告诉UNIX要与$(..)eveluated的rightside(比backtics越好):

trust=$(echo "${filename}" | cut -c1-3) 

一些准则和语法的帮助可以在Google

找到
+0

谢谢Walter。我改变了你的建议(添加在括号内),它的工作很好! – TheOriginal 2015-02-09 15:32:59

0

只需使用外壳parameter expansion

$ var=abcdefg 
$ echo "${var:0:3}" 
abc 

假设你使用的是可合理壳状的bash或ksh,例如

+0

感谢您的回应Glenn。该链接非常有用。我有书签供将来参考! – TheOriginal 2015-02-09 15:34:43

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                    

希望这对其他人有用。

+0

不要在函数中使用'$ i'和'$ j',分别使用传入的值作为'$ 1'和'$ 2'(或者根本不打算传递值。 – 2015-02-09 15:49:43

相关问题