Shell-Skript liest aus CSV-Spalte und sucht in Dateien

Shell-Skript liest aus CSV-Spalte und sucht in Dateien

Ich erstelle ein Shell-Skript, um Eingaben aus CSV-Dateien mit zwei Zeilen zu übernehmen (eine Spalte gibt die Zeit an, die andere die Dateizeichenfolge). Mein Skript funktioniert, wenn es nur eine Zeile gibt, aber es funktioniert nicht bei mehreren Zeilen. Außerdem weiß ich nicht, in welcher Zeile es nach den Dateien sucht, da es diese nicht gefunden hat.

Beispieldatei:

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

Code, ich versuche, ihn zum Laufen zu bringen.

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

Zu suchende Dateien

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

Antwort1

Vereinfachtes Skript, das davon ausgeht, dass die Datei ~vx622325/filematch.csveineeinfachCSV-Datei (ohne eingebettete Zeilenumbrüche oder Kommas):

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

Dadurch wird jeder Datensatz aus der CSV-Eingabedatei mithilfe von read(mit einem Komma als Feldtrennzeichen) in die beiden Variablen aund eingelesen b.

Die Variablen werden zum Erstellen von OR-verknüpften -nameMustern für verwendet find.

findwird dann verwendet, um nach Dateien zu suchen, deren Namen den Mustern entsprechen. Die Dateien werden stapelweise in das Zielverzeichnis kopiert und ihre Namen in der Ausgabedatei aufgezeichnet.

Mit GNU-Tools können Sie Folgendes tun:

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

Antwort2

Wie von msp9011 erwähnt, liegt das Problem bei

for i in $CNTRL_FILE 

wo der Dateiname angegeben wird, wo Sie den Inhalt der Datei angeben sollten. Einfacher Weg ist, die Datei fertigzustellen und den internen Feldtrenner (IFS) wie folgt einzustellen

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

verwandte Informationen