내 Bash 스크립트:
declare -a lang=('english' 'spainsh')
sms="Free msg: Due to upgrades on apps you’ll need a new version by yyyy/mm/dd to app running. Visit a store or go to"
url="google.com/UA2392 to upgrade your app."
awk '{print $1 "," '${servicegrade[0]}' "," '${lang[1]}' ",,," '$sms' "," '$url'}' inputfile.csv > inputfile.txt
실수:
awk: cmd. line:1: {print $1 "," 267 "," en ",,," Free
awk: cmd. line:1: ^ unexpected newline or end of string
답변1
awk
보고 있는 문제는 명령줄을 인용하는 방식(또는 더 정확하게는 인용하지 않는 방식)과 쉘 변수를 보간하는 방식과 직접적인 관련이 있습니다. (셸 및 awk
.)
당신은 이것을 가지고 있습니다 :
awk '{print $1 "," '${servicegrade[0]}' "," '${lang[1]}' ",,," '$sms' "," '$url'}' inputfile.csv > inputfile.txt
경험상 오류 메시지에서 servicegrade=267
, lang=en
, 은 보이지만 보이지는 sms=Free msg:...
않으니 url
(괜찮습니다) 가정해 보겠습니다 url=http://example.net
.
중요한 부분은 명령줄에서 따옴표를 보는 것입니다. "작은따옴표" 안에 있는 모든 내용은 단일 명령줄로 처리됩니다. 큰따옴표 옆에 작은따옴표를 넣으면( echo 'hello'"world"
인수는 하나만) 그렇게 할 수도 있습니다. 그러나 인용되지 않은 공백을 도입하면 두 번째 인수( echo 'hello' "world"
한 단어가 아닌 두 단어)가 됩니다. 또한 변수는 인용되지 않으므로 해당 값의 공백은 셸에서 하이픈으로 처리됩니다.
이러한 변수에 공백이 포함되어 있지 않다고 가정하고 변수가 아닌 실제 값인 것처럼 명령줄에 삽입해 보겠습니다.
awk '{print $1 "," '267' "," 'en' ",,," 'Free msg:...' "," 'http://example.net'}' inputfile.csv > inputfile.txt
이제 추가 따옴표를 제거하겠습니다.
awk '{print $1 "," 267 "," en ",,," Free msg:..."," http://example.net}' inputfile.csv > inputfile.txt
이제 변수 awk
로 처리할 수 없는 인용되지 않은 문자열이 표시되고 있다는 것을 곧 깨닫게 될 것입니다 . awk
나는 당신이 정말로 원하는 것이 다음과 같은 것이라고 생각합니다.
awk '{print $1 ",267,en,,,Free msg:...,http://example.net"}' inputfile.csv > inputfile.txt
(출력도 CSV 스타일인 경우 매개변수에 큰따옴표를 사용할 수 있습니다).
쉘 변수의 보간을 허용하도록 프로세스를 쉽게 되돌릴 수 있지만 더 나은 접근 방식은 이러한 쉘 변수를 awk
변수에 할당하고 사용하는 것입니다.
awk -v servicegrade="${servicegrade[0]}" -v lang="${lang[1]}" -v sms="$sms" -v url="$url" '{print $1 "," servicegrade "," lang ",,," sms "," url}' inputfile.csv > inputfile.txt
출력 텍스트에 큰따옴표로 묶인 인수가 필요하다고 결정하면 awk
(적어도 내 버전에서는) 다음 구조를 이해합니다.awk '{print $1 "\"" servicegrade "\",\"" lang "\",\"" sms "\",\"" url "\""}'