script de shell leído desde la columna csv y archivos de búsqueda

script de shell leído desde la columna csv y archivos de búsqueda

Estoy creando un script de shell para recibir información de archivos CSV, que tiene dos filas (una columna que menciona la hora y otra cadena de archivo). Mi script funciona cuando hay una fila... Pero no funciona en varias filas y, además, ¿cómo puedo hacerlo? Sé qué fila está buscando y no obtuvo los archivos.

Archivo de muestra:

1300,N213
1245,N218
1400,N222
1600,N225

Código, estoy intentando que funcione.

#!/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

Archivos para buscar

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

Respuesta1

Script simplificado, que supone que el archivo~vx622325/filematch.csv es unsimpleArchivo CSV (sin nuevas líneas ni comas incrustadas):

#!/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"

Esto lee cada registro del archivo CSV de entrada usando read, con una coma como delimitador de campo, en las dos variables ay b.

Las variables se utilizan para crear -namepatrones OR-ed para find.

findLuego se usa para buscar archivos cuyos nombres coincidan con los patrones. Los archivos se copian en el directorio de destino en lotes y sus nombres se registran en el archivo de salida.

Usando herramientas GNU, podrías hacer lo siguiente:

#!/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"

Respuesta2

Como lo menciona msp9011, el problema está en

for i in $CNTRL_FILE 

donde se proporciona el nombre del archivo, donde debería indicarse el contenido del archivo. Una forma sencilla es preparar el archivo configurando el separador de campo interno (IFS) de la siguiente manera

while IFS=, read -r column1 column2
do
    echo "column1 : $column1, column2 : $column1"
    #Take action using input
done < $CNTRL_FILE

información relacionada