각 개별 번호를 인쇄할 수 있도록 사용자가 다음 형식으로 숫자를 입력할 수 있도록 하는 가장 간단한 방법은 무엇입니까?
쉼표 구분(1,5,7), 공백 구분(1 5 7) 및 범위 구분(1-3,5)
Expected output if input is comma separated:
1
5
7
Expected output if input is space separated:
1
5
7
Expected output if input is - and , separated:
1
2
3
5
나는 다음을 시도했습니다. 논리를 정의하십시오.
input_string="1,5,7"
IFS=' ' read -r -a array <<< "$input_string"
echo ${array[1]} etc..
input_string="1 5 7"
read -r -a array <<< "$input_string"
echo ${array[1]} etc..
처리 방법이 궁금합니다. 둘 다 배열로 함께 사용하면 됩니다. 감사합니다.
답변1
먼저 쉼표/공백으로 분할하고 결과를 반복한 다음 대시로 분할하여 범위의 시작과 끝을 가져옵니다.
$ cat ranges.sh
#!/bin/bash
IFS=', ' read -a ranges <<< "$*"
for range in "${ranges[@]}"; do
IFS=- read start end <<< "$range"
[ -z "$start" ] && continue
[ -z "$end" ] && end=$start
for (( i=start ; i <= end ; i++ )); do
echo "$i"
done
done
$ bash ranges.sh 1-3,5 9-10
1
2
3
5
9
10
이는 더 나은 온전성 검사 등을 통해 달성될 수 있습니다.
답변2
또한 시도
T="$@"
echo {1..100} | { cut -d" " -f"${T// /,}"; }
답변3
awk 변형을 생각해 냈습니다.
awk -v RS='[[:blank:]]|[\n]|[,]' '{max=a[split($0, a ,"-")]; if(max!=0){while(a[1]<=max){print a[1]++}}}' /tmp/a.txt
구분된 입력을 레코드로 읽고 "-"를 사용하여 배열로 분할합니다. "-"가 없는 레코드는 첫 번째 인덱스와 마지막 인쇄 값에 저장됩니다.
입력하다:
1-3,5 6
산출:
1
2
3
5
6