2016-03-18 3 views
0

Мне нужна помощь с помощью простого сценария, который я пишу. Сценарий принимает в качестве входных данных в каталог, содержащий файлы в подобных:Bash - объединить файлы в каталог, упорядоченный по дате

FILENAME20160220.TXT 
FILENAME20160221.TXT 
FILENAME20160222.TXT 
... 

скрипт должен иметь каталог в качестве входных данных, сцепить их в новый файл с именем:

FILENAME.20160220_20160222.TXT 

Вышеуказанные имена файлов необходимо иметь «самую раннюю» дату «последней». Сценарий, который я написал до сих пор, - это, но он не создает нужный результат. Может ли кто-нибудь помочь мне возиться с ним?

declare  FILELISTING="FILELISTING.TXT" 
declare  SOURCEFOLDER="/Cat_test/cat_test/" 
declare  TEMPFOLDER="/Cat_Test/cat_test/temp/" 


# Create temporary folder 
cd $SOURCEFOLDER 
mkdir $TEMPFOLDER 
chk_abnd $? 


# Move files into temporary folder 
mv *.TXT $SOURCEFOLDER $TEMPFOLDER 
chk_abnd $? 

# Change directory to temporary folder 
cd $TEMPFOLDER 
chk_abnd $? 

# Iterate through files in temp folder and create temporary listing files 
for FILE in $TEMPFOLDER 
do 
echo $FILE >> $FILELISTING 
done 

# Iterate through the lines of FILELISTING and store dates into array for  sorting 
while read lines 
do 
     array[$i] = "${$line:x:y}" 
     ((i++)) 
done <$FILELISTING 

# Sort dates in array 
for ((i = 0; i < $n ; i++)) 
do 
    for ((j = $i; j < $n; j++)) 
    do 
     if [ $array[$i] -gt $array[$j] ] 
     then 
     t=${array[i]} 
     array[$i]=${array[$j]} 
     array[$j]=$t 
     fi 
    done 
done 

# Get first and last date of array and construct output filename 
OT_FILE=FILENAME.${array[1]}_${array[-1]}.txt 

# Sort files in folder 

# Cat files into one 
cat *.ACCT > "$OT_FILE.temp" 
chk_abnd $? 

# Remove Hex 1A 
# tr '\x1A' '' < "$OT_FILE.temp" > $OT_FILE 

# Cleanup - Remove File Listing 
rm $FILE_LISTING 
chk_abnd $? 

rm $OT_FILE.temp 
chk_abnd $? 
+0

Было бы хорошо, если бы вы могли задать более конкретный вопрос о конкретной части вашего скрипта, таких как «строка 10 не конкатенации, как я ожидал, я получаю сообщение об ошибке XYZ ». Подробнее см. На странице [mcve] s. –

+0

Вы можете запустить свой код через http://www.shellcheck.net/. Когда я это делаю, отмечены одна явная ошибка и несколько меньших предупреждений. –

+0

Добавьте 'set -x' в начало сценария и определите поток выполнения и соответствующим образом укажите соответствующий раздел. – Inian

ответ

1

Предполагая, что базовый список ваших файлов может быть идентифицирован с использованием FILENAME*.TXT, который является хорошим и простым, ls может использоваться для создания упорядоченного списка, который по умолчанию будет упорядочен по возрастанию в алфавитном порядке и, следовательно, (из-за формата даты, вы выбрали) в порядке возрастания даты.

Вы можете получить самую раннюю и lateest дату следующим образом:

$ earliest=$(ls -1 FILENAME*.TXT | head -1 | cut -c9-16) 
$ echo $earliest 
20160220 
$ latest=$(ls -1 FILENAME*.TXT | tail -1 | cut -c9-16) 
$ echo $latest 
20160222 

Поэтому ваше имя файла может быть получено с помощью:

filename="FILENAME.${earliest}_${latest}.TXT" 

И конкатенация должна быть столь же простой, как:

cat $(ls -1 FILENAME*.TXT) > ${filename} 

хотя, если вы пишете в тот же каталог, вы можете направлять вывод f сначала временное имя, которое не соответствует этому шаблону, а затем переименовывает его. Возможно, что-то вроде:

earliest=$(ls -1 FILENAME*.TXT | head -1 | cut -c9-16) 
latest=$(ls -1 FILENAME*.TXT | tail -1 | cut -c9-16) 
filename="FILENAME.${earliest}_${latest}.TXT" 
cat $(ls -1 FILENAME*.TXT) > temp_${filename} 
mv temp_${filename} ${filename} 
1

Подсказка: cat выполняет большую часть работы. Если в ваших именах указаны поля даты фиксированного размера, как в вашем примере, лексической сортировки достаточно.

ls -1 FILENAME* > allfiles 
aggname=$(cat allfiles | sed -rn '1s/([^0-9]*)/\1./p;$s/[^0-9]*//p' | 
paste -sd-) 
cat allfiles | xargs cat > $aggname 

Вы можете объединить последние два шага в один, но более читаемый таким образом.

не изобретать велосипед.

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