공백으로 구분된 두 개의 문자열로 한 줄을 구분해야 합니다(예: ) 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