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

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

관련 정보