아래 코드를 사용하고 있는데 잘못된 출력이 나오는 속성 파일의 값을 동적으로 인쇄하고 싶습니다.
테스트속성.속성
edmcws,edmbws,edmwt
암호
file=/ThreadDump/testProperty.properties
count=$(head -1 $file | sed 's/[^,]//g' | wc -c)
echo "$count"
for((i=1;i<=$count;i++))
do
abc=$(awk -F "," '(NR==1){print $($i)}' $file)
echo "$abc"
done
산출
3
edmcws,edmbws,edmwt
edmcws,edmbws,edmwt
edmcws,edmbws,edmwt
그러나 값을 하드코딩하면 올바른 출력을 얻습니다.
암호
file=/ThreadDump/testProperty.properties
count=$(head -1 $file | sed 's/[^,]//g' | wc -c)
echo "$count"
for((i=1;i<=$count;i++))
do
abc=$(awk -F "," '(NR==1){print $1}' $file)
echo "$abc"
done
산출
3
edmcws
edmcws
edmcws
답변1
awk 본문은 작은따옴표로 묶여 있으므로 awk는 쉘 변수를 볼 수 없습니다. awk는 awk 변수를 의미한다고 생각합니다 i
. 변수가 정의되지 않았으므로 숫자 컨텍스트에서 해당 값은 0입니다. 그래서 $i
awk는 그것을 $0
또는 전체 라인으로 해석합니다.
awk에 쉘 변수를 전달해야 합니다.
for ((i=1; i<=$count; i++))
do
abc=$(awk -F "," -v col=$i 'NR==1 {print $col}' $file)
#................^^^^^^^^^...............^^^^
echo "$abc"
done
그러나 awk를 개별적으로 3번 호출하는 것보다 더 좋은 방법이 있습니다.
while IFS=, read -ra fields; do
printf "%s\n" "${fields[@]}"
# or do stuff with the individual fields
for ((i=0; i < ${#fields[@]}; i++)); do
echo "${fields[i]}"
done
done < "$file"
- 루프
while
, 파일 내용을 해당 파일로 리디렉션, 파일 줄을 반복합니다. IFS=,
read
명령을 쉼표로 구분하도록 지시합니다 .read -r
특수 문자가 일반 문자 이외의 문자로 해석되지 않음을 의미합니다.read -a fields
줄의 단어를 배열 변수라는 이름으로 읽습니다.fields
답변2
당신은 을 사용하고 있습니다 abc=$(awk -F "," '(NR==1){print $($i)}' $file)
. 여기서는 awk 스크립트 주위에 작은따옴표를 사용합니다. 따라서 유사한 변수는 $i
해당 값으로 대체되지 않습니다.
따라서 는 i=1
두 번째 예에 제공된 것이 아니라 awk
문자 그대로 표시됩니다 .$($i)
$1
이 옵션을 사용하여 awk에 변수를 할당할 수 있습니다 -v
.
어쩌면 awk
작업에 완벽한 도구가 아닐 수도 있습니다. 나는 단순히 사용할 수도 있습니다
perl -wnle 'print for split ","'