2015-02-10 2 views
0

Я работаю над созданием скрипта, который может принимать файлlist1 (список tar-файлов) и filelist2 (список каталогов). Мне нужно прокрутить/прочитать список файлов и получить первый файл в файлеlist1 mv до первого каталога в файлеlist2. После этого я буду извлекать и выполнять другие действия над файлами в этой папке. Попытка автоматизировать, так как я буду иметь 130 плюс tar-файлы каждый день, каждый из которых содержит от 75 до 200 сотен файлов, которые необходимо обработать. Ниже приведен сценарий, я работаю над (WIP):итерации через два списка внешних файлов и выполнение команд в сценарии bash

############################################################################# 
############################################################################# 
# 
# Incremental load script v1 
# Created 02/09/2015 NHR 
# 
############################################################################# 
############################################################################# 

# 
# Clean up before running 
# 
# "/u02/hdfs_staging/ios/incremental/TOPACTR_DeltaFiles" 
# 


if [ -f filelist1 ] ; then 
    rm filelist1 
fi 

if [ -f filelist2 ] ; then 
    rm filelist2 
fi 

# 
# Create filelist containing name of files parsed for dir's loaded from kdwxxxx 
# 
for i in *tar 
    do 
     echo "$i" | rev | cut -d"." -f2 | rev >> filelist1 
    done 

# 
# Create work dir's for extracting tar files into for each date 
# 
while IFS= read -r file 
    do 
     [ ! -d "$file" ] && mkdir "$file" 
    done < "/u02/hdfs_staging/ios/incremental/TOPACTR_DeltaFiles/filelist1" 

# 
# Create filelist2 containing name of files parsed to copy 
# tar files to dir's for extraction 
# 
shopt -s nullglob     # Bash extension, so that empty glob matches will work 
    for file in ./*.tar ; do  # Use this, NOT "for file in *" 
     echo "$file" >> filelist2 
    done 

# 
# Copy and Decompress tar files in these new dir's 
# HERE IS WHERE I NEED TO LOOP THROUGH THE FILELIST1 AND FILELIST2 
# AND PERFORM ADDITIONAL COMMANDS 
# 



# 
# Execute hive load to external table script to load incremental files to ios_incremental. 
# The ios_incremental database tables for these files is in place. 
# 


#hive -e CREATE EXTERNAL TABLE $filelist 


# 
# Run hive SQL script to add changed files to ios_staging tables. 
# This will be called from a hql script file and will require variables 
# for each table involved. This view combines record sets from both the 
# Base (base_table) and Change (incremental_table) tables and is reduced 
# only to the most recent records for each unique .id. It is defined as 
# follows: 
# 

#hive -e 
# CREATE VIEW reconcile_view AS 
# SELECT t1.* FROM 
# (SELECT * FROM base_table 
#   UNION ALL 
#   SELECT * FROM incremental_table) t1 
# JOIN 
#  (SELECT id, max(modified_date) max_modified FROM 
#   (SELECT * FROM base_table 
#   UNION ALL 
#   SELECT * FROM incremental_table) t2 
#  GROUP BY id) s 
# ON t1.id = s.id AND t1.modified_date = s.max_modified; 
# 


# 
# Copy updated ios_staging data to update ios_prod db 
# 



# 
# Clean and Archive files to get ready for next incremental load 
# 
+3

Так где же ваш вопрос? – leigero

ответ

0

Я думаю, что вы ищете, чтобы перебирать два списка одновременно.

Вот один из способов сделать это, который предполагает, что имена файлов не имеют либо символ новой строки или двоеточие в их именах (это легко изменить двоеточие в какой-то другой символ):

paste -d: filelist1 filelist2 | while IFS=: read -r file1 file2; do 
    some_command "$file1" "$file2" 
    # ... 
done 

более защитным решением было бы перевести списки в массивы, а не файлы, а затем перебирать с помощью цикла for. (Я ушел из создания массивов, есть много примеров на SO):

for ((i=0;i<${#filearray1[@]};++i)); do 
    file1="${filearray1[i]}" 
    file2="${filearray2[i]}" 
    some_command "$file1" "$file2" 
    # ... 
done 
0

Возможно, что-то вроде этого (явно не хватает проверки ошибок):

exec 3< filelist1 4< filelist2 

while read -u3 tarfile 
do 
    read -u4 destination 
    mv "${tarfile}" "${destination}"/. 
    (cd "${destination}" 
    # ... other stuff 
) # subshell is to avoid having to cd back where you came from 
done 

exec 3<&- 4<&- 
Смежные вопросы