디렉터리에서 일부 파일 이름을 읽고 추출하여 배열에 추가하려고 합니다. 해당 디렉터리에 중복된 파일이 있으므로 일부 중복된 파일 이름도 추출하겠습니다. 디렉터리의 원본 파일 이름은 다음과 같습니다.
100_abc strategy-42005_04May2020_0000-04May2020_first_file.csv
100_abc strategy-42005_04May2020_0000-04May2020_second_file.csv
101_xyz statitics strategy_04May2020_first_file.csv
사용된 스크립트:
#!/bin/bash
c=0
for filename in /home/vikrant_singh_rana/testing/*; do
#stripping a file name
GroupName=$(basename "$filename" ".csv" | awk -F "_" '{print $2}' | awk -F "-" '{print $1}')
echo "$GroupName"
var=["$c"]="$GroupName"
c=$(($c+1))
done
echo "print my array"
echo "${var[*]}"
디렉토리에서 추출한 파일 이름에는 공백이 포함되어 있습니다. 예를 들어.
abc strategy
abc strategy
xyz statistics strategy
그래서 배열을 인쇄하면 다음과 같이 인쇄됩니다.
abc strategy abc strategy xyz statistics strategy
읽는 동안 동일한 파일이 다시 발견되면 위의 코드는 동일한 파일 이름을 배열에 다시 추가합니다.
그래서 이를 방지하기 위해 if 문을 추가했는데 예상대로 작동하지 않았습니다. 나는 배열이 요소로서 고유한 파일 이름을 가져야 한다고 예상했습니다.
for filename in /home/vikrant_singh_rana/testing/*; do
GroupName=$(basename "$filename" ".csv" | awk -F "_" '{print $2}' | awk -F "-" '{print $1}')
if [[ "${var[@]}" =~ "$GroupName" ]]; then
echo "I am here "
c=$(($c+1))
var["$c"]="$GroupName"
fi
done
답변1
sort
파이프라인에서는 더 쉬울 수 있습니다.
readarray -t var < <(
cd "$HOME/testing"
printf "%s\n" * | cut -d"_" -f2 | cut -d"-" -f1 | sort -u
)
readarray
stdin 라인을 배열로 빨아들입니다.
다음을 사용하여 배열을 확인할 수 있습니다.declare -p var