각 행이 다음과 같은 새로운 고객 정보인 파일이 있습니다.
Pop corn, [email protected], 50, 200
awk/gawk script
현재 a를 사용하여 각 열을 변수에 할당한 다음 해당 변수를 sed
템플릿에 연결할 수 있는지 확인하려고 합니다 . bash 스크립트에서 awk/gawk 및 sed를 실행하겠습니다. 이 작업을 수행하려면 어떤 좋은 구현을 따라야 합니까? grep
awk/gawk, sed, bash 스크립트를 밀접하게 사용하는 방법을 배우려고 하거나 perl
아직 배우지 않았기 때문에 사용하지 않으려고 합니다 .
답변1
내 생각에는 다음과 같이 하는 것이 더 나을 것 같습니다.
while IFS=, read -r name email x y _ignored_; do
email=${email# } x=${x# } y=${y# }
sendmail -oem -oi -t << EOF
To: $name <$email>
Subject: Whatever
x=$x y=$y
EOF
done < file.csv
어쨌든 각 줄에서 최소한 하나의 명령을 실행하게 되므로 셸을 사용하여 줄을 변수로 읽어 들입니다. 그리고 이 문서에서는 sed
템플릿 확장 대신 쉘 변수 확장을 사용합니다.
awk
or (셸을 실행하여 명령줄을 구문 분석하는)을 system()
사용하여 명령을 실행할 수는 있지만 여기서는 별로 도움이 되지 않습니다.getline()
놓다이러한 변수에 대한 환경 변수와 이를 설정하는 셸 코드를 빌드합니다. 따라서 상당히 복잡해지고 효율성이 떨어질 수 있습니다. 그것은 다음과 같습니다:
CODE='sendmail -oem -oi -t << EOF
to: $name <$email>
Subject: Whatever
x=$x y=$y
EOF' awk -F ', *' -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{system("name="shquote($1)" email="shquote($2)" x="shquote($3) \
" y="shquote($4)"\n"ENVIRON["CODE"])}' < file.csv
답변2
특정 구분 기호가 있는 배열로 행을 읽으려면 split
의 기능을 사용하십시오 .awk
awk '{split($0, array, /,/)}' customers_file
sed
그런 다음 간단히 인쇄하여 해당 배열의 요소를 전달할 수 있습니다 awk
.