텍스트 파일의 첫 번째 줄 값을 배열에 저장하려고 합니다. 지금까지 내가 가진 것은 다음과 같습니다.
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
그게 전부입니다. 이제 위치 매개변수는 다양한 배열 인덱스이고 배열은 입니다 "$@"
.