csv 열에서 파일을 읽고 검색하는 쉘 스크립트

csv 열에서 파일을 읽고 검색하는 쉘 스크립트

두 행(하나는 시간을 언급하고 다른 하나는 파일 문자열을 언급함)이 있는 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"

read이는 필드 구분 기호로 쉼표를 사용하여 입력 CSV 파일의 각 레코드를 두 개의 변수 asum 으로 읽습니다 b.

-name이러한 변수는 OR 패턴을 생성하는 데 사용됩니다 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

관련 정보