
Я создаю скрипт оболочки для получения входных данных из CSV-файлов, содержащих две строки (один столбец с указанием времени и другой строкой файла). Мой скрипт работает, когда есть одна строка... Но он не работает с несколькими строками, и как я могу узнать, в какой строке он ищет данные, если не найдены файлы.
Пример файла:
1300,N213
1245,N218
1400,N222
1600,N225
Код, я пытаюсь заставить его работать.
#!/bin/bash
tr_filepath=/var/opt/data/nms_umts_pms_seg/segment1/
echo "Folder to search for traces ${tr_filepath}"
tr_newpath=/var/opt/ericsson/nms_umts_pms_seg/segment1/edos/4G/
CNTRL_FILE=/home/vx622325/filematch.csv
echo "File Contents of ${CNTRL_FILE} to match with pattern"
for i in $CNTRL_FILE;
do
t=$(cat $i | awk -F"," '{ print $1}')
n=$(cat $i | awk -F"," '{ print $2}')
X=`find "$tr_filepath" -type f -iname "A*."$t"*,*="$n"*.bin.gz"`
echo -e "Traces To Copy \n $X\n" >> /home/vx622325/result_`date +"%d_%m_%Y"`.csv
if [ -d "$tr_newpath" ]; then
y= cp -rp $X $tr_newpath
else
echo "Output folder $tr_newpath not found" > /home/vx622325/result_`date +"%d_%m_%Y"`.csv
fi
done
Файлы для поиска
A20190118.2200+0300-2201+0300_SubNetwork=ONRM_RootMo,SubNetwork=N213,MeContext=N213,ManagedElement=1_rnc_gpehfile_Mp0.bin.gz
A20190118.2200+0300-2201+0300_SubNetwork=ONRM_RootMo,SubNetwork=N213,MeContext=N213,ManagedElement=1_rnc_gpehfile_Mp10.bin.gz
A20190118.2200+0300-2201+0300_SubNetwork=ONRM_RootMo,SubNetwork=N213,MeContext=N213,ManagedElement=1_rnc_gpehfile_Mp11.bin.gz
решение1
Упрощенный сценарий, который предполагает, что файл ~vx622325/filematch.csv
являетсяпростойФайл CSV (без встроенных символов новой строки и запятых):
#!/bin/sh
tr_filepath=/var/opt/data/nms_umts_pms_seg/segment1
tr_newpath=/var/opt/ericsson/nms_umts_pms_seg/segment1/edos/4G
result_out=~vx622325/$( date +'result_%d_%m_%Y.log' )
if [ -d "$tr_newpath" ]; then
printf 'Destination does not exist: %s\n' "$tr_newpath" >"$result_out"
exit 1
fi
set --
while IFS=, read -r a b; do
set -- "$@" -o -name "A*.$a*,*=$b*.bin.gz"
done <~vx622325/filematch.csv
shift # removes the initial "-o"
find "$tr_filepath" -type f \( "$@" \) -exec sh -c '
dest=$1; shift
cp "$@" "$dest"/
printf "Copied: %s\n" "$@"' sh "$tr_newpath" {} + >"$result_out"
При этом каждая запись из входного CSV-файла считывается read
с использованием запятой в качестве разделителя полей в две переменные a
и b
.
Переменные используются для создания OR- -name
шаблонов для find
.
find
затем используется для поиска файлов, имена которых соответствуют шаблонам. Файлы копируются в целевой каталог партиями, а их имена записываются в выходной файл.
Используя инструменты GNU, вы можете сделать следующее:
#!/bin/bash
tr_filepath=/var/opt/data/nms_umts_pms_seg/segment1
tr_newpath=/var/opt/ericsson/nms_umts_pms_seg/segment1/edos/4G
printf -v result_out '%s/result_%(%d_%m_%Y)T.log' ~vx622325 -1
if [ -d "$tr_newpath" ]; then
printf 'Destination does not exist: %s\n' "$tr_newpath" >"$result_out"
exit 1
fi
namepats=()
while IFS=, read -r a b; do
namepats+=( -o -name "A*.$a*,*=$b*.bin.gz" )
done <~vx622325/filematch.csv
find "$tr_filepath" -type f \( "${namepats[@]:1}" \) \
-exec cp -t "$tr_newpath"/ {} + \
-printf 'Copied: %p\n' >"$result_out"
решение2
Как упомянул msp9011, проблема в
for i in $CNTRL_FILE
где имя файла указано, где вы должны указать содержимое файла. Простой способ — подготовить файл, установив внутренний разделитель полей (IFS) следующим образом
while IFS=, read -r column1 column2
do
echo "column1 : $column1, column2 : $column1"
#Take action using input
done < $CNTRL_FILE