csv 파일의 값을 동적으로 인쇄하고 싶습니다.

csv 파일의 값을 동적으로 인쇄하고 싶습니다.

아래 코드를 사용하고 있는데 잘못된 출력이 나오는 속성 파일의 값을 동적으로 인쇄하고 싶습니다.

테스트속성.속성

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입니다. 그래서 $iawk는 그것을 $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 ","'

관련 정보