읽다

읽다

공백으로 구분된 두 개의 문자열로 한 줄을 구분해야 합니다(예: ) key value.

나는 시도했다:

key=$(awk -FS=" " {print $1} line)
value=$(awk -FS=" " {print $2} line)

하지만 나는 다음을 얻습니다.

awk: line 2: 누락 } 파일 끝 근처

어떤 아이디어가 있나요?

답변1

awk명령줄의 스크립트는 작은따옴표로 묶어야 합니다.

awk -F ' ' '{ print $1 }' filename

주변의 작은따옴표 에 유의하세요 { ... }. 이를 설정하는 올바른 방법은 블록을 FS통해 -F, 통과 -v FS=...또는 BEGIN블록 내에서 설정하는 것이지만 with 에서는 설정하지 않습니다 -FS=....

귀하가 작성한 명령도 line파일 이름으로 가정합니다.


$line공백이 하나만 있는 문자열인 경우 두 개의 문자열로 나눌 수 있습니다 .

first_part=${line% *}   # removes the space and everything after it
second_part=${line#* }  # removes the space and everything before it

마찬가지로, if는 $line다음을 포함하는 문자열입니다.=

first_part=${line%=*}   # removes the = and everything after it
second_part=${line#*=}  # removes the = and everything before it

답변2

배열을 사용하여 공백의 줄을 분할할 수도 있습니다.

만약에철사string

  arr=($line)
  key="${arr[0]}"
  value="${arr[1]}"

참고:- $line의 첫 번째 단어가 *인 경우 arr 배열에는 현재 디렉터리의 모든 파일 이름이 포함됩니다. 따라서 안전을 유지하고 이와 같은 상황을 피하려면 다음을 사용하십시오.

set -f; arr=($line); set +f key="${arr[0]}" value="${arr[1]}"

만약에철사file

while read -r words
do
  set -- $words
  key=$1
  value=$2
done < line

답변3

읽다

그냥 사용하십시오 read:

read key value

줄의 첫 번째 공백 앞의 모든 내용은 에 들어가고 key그 이후의 모든 내용(다른 공백 포함)은 에 들어갑니다 value.

답변4

외부 프로그램을 호출하는 대신 쉘의 인수 확장 기능을 사용할 수 있습니다.

key=${line%% *}     # from the end remove the longest string matching
                    # a space followed by any characters

value=${line#* }    # from the start remove the shortest string matching
                    # any characters followed by a space

관련 정보