awk를 사용하여 변수를 만들고 내보내거나 가져오시겠습니까?

awk를 사용하여 변수를 만들고 내보내거나 가져오시겠습니까?

각 행이 다음과 같은 새로운 고객 정보인 파일이 있습니다.

Pop corn, [email protected], 50, 200

awk/gawk script현재 a를 사용하여 각 열을 변수에 할당한 다음 해당 변수를 sed템플릿에 연결할 수 있는지 확인하려고 합니다 . bash 스크립트에서 awk/gawk 및 sed를 실행하겠습니다. 이 작업을 수행하려면 어떤 좋은 구현을 따라야 합니까? grepawk/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템플릿 확장 대신 쉘 변수 확장을 사용합니다.

awkor (셸을 실행하여 명령줄을 구문 분석하는)을 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.

관련 정보