"#"으로 구분된 줄이 있고 3개의 필드가 포함된 샘플 파일이 있습니다.
A#B#C
D#E#F
다음 대신 UNIX 변수 대체를 사용하여 행의 각 필드 값을 가져올 수 있습니까?
cat file | while read a; do
f1=`echo $a | cut -d# -f1`
f2=`echo $a | cut -d# -f2`
f3=`echo $a | cut -d# -f3`
done
답변1
이것이 의미하는 바라면 매개변수 확장을 사용할 수 있습니다. 하지만 읽기가 쉽지 않습니다.
while read a; do
# comments are for the first line A#B#C
f1f2=${a%#*} # remove suffix #C -> A#B
f1=${f1f2%#*} # remove suffix #B -> A
f2=${f1f2#*#} # remove prefix A# -> B
f3=${a##*#} # remove longest prefix: A#B# -> C
echo "$f1,$f2,$f3" # do something with f1,f2,f3
done < file
IFS=#
내부 필드 구분 변수를 설정하고 각 행을 세 개의 변수로 분할하는 것이 더 쉽습니다.
while IFS=# read f1 f2 f3; do
echo "$f1,$f2,$f3" # do something with f1,f2,f3
done < file
답변2
ksh에서는 배열을 사용할 수도 있습니다.
while IFS='#' read -A arr; do
echo "${#arr[@]} items, second item: ${arr[1]}"
done < file
read -A
Zsh에서도 작동하지만 배열 인덱싱은 1 기반입니다. Bash는 read -a
ksh와 유사하게 작동합니다.