텍스트 파일에서 입력을 읽는 쉘 스크립트

텍스트 파일에서 입력을 읽는 쉘 스크립트

텍스트 파일에서 입력을 읽는 쉘 스크립트를 작성 중입니다.

Path1:/home/demo/path0
FILE1:test.dat,sample.txt
PATH2:/home/demo/path1
FILE2:demo1.dat,xyzb.txt
PATH3:/home/demo/path2
FILE3: samplecsv.csv,somepdf.pdf

별도의 폴더에 파일 경로를 지정하여 FILE1파일을 별도의 폴더에 출력해야 합니다.test.datsample.txtFILE2:demo1.dat,xyzb.txt

다음을 시도했지만 원하는 결과를 얻지 못했습니다.

val=`cat filename`
Count=${#val[@]}
for (( i=0; i<$Count ; i++))
do
var=`echo ${val[i]} | sed -e 's/\.//g'`
one=$(grep PATH1 ${val[i]} | awk -F':' '{print $2}');
two=$(grep FILE1 ${val[i]} | awk -F':' '{print $2}');
done
echo $var
echo $one
echo $two

답변1

노트:

  1. for파일의 행을 읽는 데 사용하지 마십시오.
  2. --see $(...)대신 사용`...`https://github.com/koalaman/shellcheck/wiki/SC2006 자세한 내용은.
  3. awk해야 할 일을 수행 grep하므로 파이프라인에서 두 가지를 모두 수행할 필요가 없습니다. 그러나 이 경우에도 필요하지 않습니다.

난 쓸수있다

# so the case statement below will match case-insensitively
shopt -s nocasematch

paths=()
files=()

while IFS=: read -r key value; do
    case $key in
        PATH*) paths+=("$value") ;;
        FILE*) files+=("$value") ;;
    esac
done < filename

declare -p paths files

이 출력

declare -a paths=([0]="/home/demo/path0" [1]="/home/demo/path1" [2]="/home/demo/path2")
declare -a files=([0]="test.dat,sample.txt" [1]="demo1.dat,xyzb.txt" [2]=" samplecsv.csv,somepdf.pdf")

필요에 따라 배열을 반복할 수 있습니다.

관련 정보