awk와 bash를 사용하여 배열을 초기화하는 방법은 무엇입니까?

awk와 bash를 사용하여 배열을 초기화하는 방법은 무엇입니까?

텍스트 파일의 첫 번째 줄 값을 배열에 저장하려고 합니다. 이것이 내가 지금까지 가지고 있는 것입니다:

arr_values=()

awk '
    NR==1 {
            for (i=0; i<=NF; i++)
               'arr_values[i]'=$i            #error here
          }' file.txt

for ((i=0; i<${#arr_values[@]}; i++))
do
   echo ${arr_values[i]}
done

awk배열을 초기화할 때 오류가 발생합니다. 주로 외부 배열을 초기화하는 데 배열을 사용하는 방법을 모르기 때문입니다 . 제안 사항이 있습니까(만 awk)? 감사해요.

교차 게시글을 작성하여 죄송합니다. 원하는 답변을 얻지 못했습니다.

답변1

맥락을 설명하면 더 나은 답변을 얻을 수 있습니다. awk...데이터의 첫 번째 행은 어떻게 생겼나요?

필드 구분 기호를 변경하지 않았으므로 공백으로 구분된 항목 행을 다루고 있다고 가정합니다. 다음은 귀하의 요구 사항을 완벽하게 충족합니다.

arr_values=()

read -ra arr_values <<< $(head -n 1 file.txt)

for s in "${arr_values[@]}"; do
    echo "$s"
done

모든 작업은 read명령으로 수행됩니다. 배열의 값을 여러 번 처리해야 하는 경우가 아니면 다음을 수행하면 됩니다.

set -f    # disable globbing, in case the lines contain wildcard characters
for s in $(head -n 1 file.txt); do
    set +f
    echo "$s"
done
set +f

이렇게 하면 공백으로 구분된 공백이 아닌 각 필드 항목이 루프에 들어가 $s루프를 통해 전달됩니다.

답변2

정확히 이런 식으로 할 수는 없습니다. awk 명령을 실행하고 일부 구분 기호(공백, 탭, NUL 등)로 구분된 일련의 출력 값을 생성한 다음 이를 배열 요소에 할당해야 합니다. 그 이유는 awk가 쉘에 의해 실행되는 프로그램이기 때문입니다. 먼저 완료될 때까지 실행됩니다.어느더 많은 셸 작업을 수행합니다. 이와 같은 awk 콘텐츠에 쉘 콘텐츠를 삽입할 수 없습니다.

간단한 예제를 사용하기 위해 다음과 같은 작업을 수행할 수 있지만 제공한 awk 코드가 어떤 경우에도 원하는 대로 작동하는지 잘 모르겠습니다. 파일에 레코드가 없거나 둘 이상인 경우 출력(및 쉘 배열)에는 파일에 대한 행이 포함됩니다. 레코드가 하나만 포함된 경우에만 출력 배열에 0부터 파일에서 찾은 필드 수까지의 정수 집합이 포함되기를 원하는 것 같습니다. 배열에서 더 큰 파일을 피하려면 아래에서 수행한 것처럼 작업으로 "{ }"만 포함하는 awk 코드에 두 번째 모덜리스 작업을 추가해야 합니다. 또한 set -f행에 와일드카드 문자가 포함된 경우 파일 이름 와일드카드 확장( )을 끄십시오 \[*?.

set -f
arr_values=(`awk '
    NR==1 {
            for (i=0; i<=NF; i++)
               print $i
          }

          { }' file.txt`)
set +f
for ((i=0; i<${#arr_values[@]}; i++))
do
   echo "${arr_values[i]}"
done

답변3

를 사용하려면 awk다음과 같이 하세요.

arr_values=( $(awk '{print;exit}' file) )

쉘은 공백으로 분할됩니다. 줄에 와일드카드 문자가 포함되어 있으면 일치하는 파일 목록(있는 경우)으로 확장됩니다. 와일드카드 확장을 비활성화 하는 데 사용됩니다 set -f.

set -f
arr_values=( $(awk '{print;exit}' file) )
set +f

답변4

다른 것은 모르겠지만 공백으로 분할하면 텍스트 파일의 첫 번째 줄이 공백으로 분할된 쉘 배열에 저장됩니다.

set -f ; set -- $(head -n1 <textfile) ; set +f

그게 다야. 이제 위치 매개변수는 다양한 배열 인덱스이고 배열은 입니다 "$@".

관련 정보