2015-02-09 1 views
0

это мой первый пост, поэтому, надеюсь, я стану моим вопросом понятным.Используйте первые 3 символа имени файла как переменной в сценарии оболочки

Я новичок в сценариях оболочки, и моя задача заключается в том, чтобы добавить новое значение в каждую строку файла csv. Значение, которое необходимо добавить, основано на первых трех цифрах имени файла.

Я немного фона. Файлы csv, которые я получаю, в конечном итоге загружаются в секционированные таблицы оракула. Начало имени файла (например, 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 «сайтов ', и это упростит добавление дополнений к коду, когда файлы придут ко мне. То же самое должно быть siad для массива 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 через другой вопрос о StackOverflow, как я исследовал, но это не похоже на работу для меня. Я добавил в echo, чтобы проверить, что держал trust, но он был пуст.

Я получаю 2 ошибки обратно: Line 17 - BATTESTFILE: не найдено Line 19 - Тест:] пропавшие

Извините за долгое наматывается вопросы. Надеюсь, он содержит полезную информацию и показывает шаги, которые я предпринял. Все вопросы, комментарии прочь. Любая помощь или руководство очень ценятся. Благодарю.

+0

Какую оболочку вы используете? Похож на ksh. Какая версия? Попробуйте 'ksh --version' –

ответ

0

Когда вы новичок в оболочках, попробуйте избежать массивов.
В выражении if используются пробелы до и после символов [и]. Привыкайте к окружающему переменных оболочек с {} как $ {доверия}

Я не знаю, как вы заполняете свой массив, когда массив является жёстко, попробуйте те заменить САЙТ = file1 SITE = "$ { САЙТ} file2"

и вы должны сказать UNIX вы хотите иметь RightSide eveluated с $ (..) (лучше backtics):

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

Некоторые принципы и синтаксис помощь можно найти на Google

+0

Спасибо Уолтеру. Я изменил свою линию на то, что вы предложили (добавлено в скобки), и это сработало! – TheOriginal

0

Просто используйте оболочки parameter expansion:

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

Предполагая, что вы используете достаточно способные оболочки, как Баш или KSH, например

+0

Спасибо за ваш ответ Гленн. Эта ссылка действительно полезна. У меня есть закладки для будущих ссылок! – TheOriginal

0

На всяком случае еще сейчас полезно для тех, или в будущем, я чтобы мой код работал по желанию, используя приведенное ниже. Спасибо Уолтеру А ниже за его ответ на мою основную проблему получения первых трех символов из имени файла и использования их в качестве переменной.

Это дало мне желаемый результат ввода первых трех символов имени файла и добавления их в конец каждой строки в моем файле 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' соответственно (или не утруждайте себя передачей значений вообще. –

Смежные вопросы