명칭,값이 들어있는 data.txt를 읽어 다른 파일에 있는 명칭을 치환하는 방법?

라스코니의 이미지

안녕하세요.

명칭 값이 들어 있는 아래와 같은 data.txt가 있습니다.
AAA 10
BBB 100
CCC 1000

다른 cmd.txt가 아래와 같이 있을 때 data.txt를 읽어 명칭과 값을 치환하고 싶습니다.
COMMAND AAA SEND
COMMAND BBB SEND
COMMAND CCC SEND

원하는 결과는 아래와 같습니다.
COMMAND 10 SEND
COMMAND 100 SEND
COMMAND 1000 SEND

sed, awk, grep 등을 써서 할 수 있을 것 같은데 좀 알려주시면 감사하겠습니다.
꼭 sed 등을 안써도 되고, 다른 방법이 있다면 소개 부탁드립니다.

ymir의 이미지

$ cat data.txt 
AAA 10
BBB 100
CCC 1000
$ cat cmd.txt 
COMMAND AAA SEND
COMMAND BBB SEND
COMMAND CCC SEND
$ join -1 2 -2 1 cmd.txt data.txt
AAA COMMAND SEND 10
BBB COMMAND SEND 100
CCC COMMAND SEND 1000
$ join -1 2 -2 1 cmd.txt data.txt | while read -r data cmd send val; do echo $cmd $val $send; done
COMMAND 10 SEND
COMMAND 100 SEND
COMMAND 1000 SEND

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

같은 결과가 안나오는데요. Ubuntu 20.04입니다.

xxxxx@ubuntu:~/test$ cat data.txt
AAA 10
BBB 100
CCC 1000xxxxx@ubuntu:~/test$ 
xxxxx@ubuntu:~/test$ 
xxxxx@ubuntu:~/test$ cat cmd.txt 
COMMAND AAA SEND
COMMAND BBB SEND
COMMAND CCC SENDxxxxx@ubuntu:~/test$ join -1 2 -2 1 cmd.txt data.txt
 10 COMMAND SEND
 100COMMAND SEND
CCC COMMAND SEND 1000
xxxxx@ubuntu:~/test$ join -1 2 -2 1 cmd.txt data.txt | while read -r data cmd send val; do echo $cmd $val $send; done
 SENDND 10
 SENDND 100
COMMAND 1000 SEND
xxxxx@ubuntu:~/test$ 

ymir의 이미지

SEND 가 앞에 있는 COMMAND 를 덮어썼네요.
file 명령으로 unix 파일인지 확인해 보시고, unix 파일이 아니라면 dos2unix 명령으로 unix 파일로 바꿔주세요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

dos2unix를 사용하니 같은 결과가 나오네요. 감사합니다 ^^
그런데 data.txt 양식은 동일한데 사실 cmd.txt 는 여러가지가 있을 수 있거든요. 아래처럼요.
COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
등등 다양한데 이런 경우에도 적용할 수 있을까요?

ymir의 이미지

join 은 정형화 된 포맷을 가진 상태에서, 해당 필드로 정렬되어 있고, 중복이 없을 때에만 사용 가능 합니다.
그나마 아래 것은 쓸 수 있을 것 같은데, 마찬가지로 변수가 누락되어 있거나, 누락된 상태에서 환경 변수와 같은 변수 명을 사용하고 있다면 문제가 생길 수 있습니다.
어쨌거나 위 두 COMMAND 는 포맷이 다르므로 각각 다른 방식을 써야할 것 같네요.

$ eval $(cat data.txt | sed 's/ /=/g')
$ cat cmd.txt
COMMAND AAA SEND
COMMAND BBB SEND
COMMAND CCC SEND
COMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
$ cat cmd.txt | sed 's/COMMAND \(.*\) SEND/COMMAND SEND \1/g' | \
> while read -r cmd send datas; do \
> grep -q = <<< $datas && datas="$(eval echo $(sed 's/=/=\$/g' <<< $datas))" || datas="$(eval echo \$$datas)"; \
> echo $cmd $datas $send; done
COMMAND 10 SEND
COMMAND 100 SEND
COMMAND 1000 SEND
COMMAND A1=10, A2=100, DELAY=1000 SEND

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

감사합니다. 그런데 data.txt는 어떻게 넣어야 하나요? shell script에 문외한이라서.
datas가 data.txt 인가요? 가능하면 bash shell로 나타내 주실수 있을까요?

ymir의 이미지

$ cat data.txt
AAA 10
BBB 100
CCC 1000
$ cat cmd.txt
COMMAND AAA SEND
COMMAND BBB SEND
COMMAND CCC SEND
COMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
$ cat run.sh
#!/bin/bash
 
eval $(cat data.txt | sed 's/ /=/g')
 
cat cmd.txt | sed 's/COMMAND \(.*\) SEND/COMMAND SEND \1/g' | \
        while read -r cmd send datas; do
                grep -q = <<< $datas && datas="$(eval echo $(sed 's/=/=\$/g' <<< $datas))" || datas="$(eval echo \$$datas)";
                echo $cmd $datas $send;
         done
 
exit 0;
 
$ bash run.sh
COMMAND 10 SEND
COMMAND 100 SEND
COMMAND 1000 SEND
COMMAND A1=10, A2=100, DELAY=1000 SEND

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

감사합니다!!! 완벽하네요.
이 기능을 토대로 완성할 수 있을 것 같습니다. 감사합니다.

ymir의 이미지

$ eval $(cat data.txt | sed 's/ /=/g')
$ echo $AAA
10
$ cat cmd.txt | while read -r cmd data send; do eval echo "$cmd \$$data $send"; done
COMMAND 10 SEND
COMMAND 100 SEND
COMMAND 1000 SEND

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

역시 같은 결과가 나오지 않습니다.

xxxxxx@ubuntu:~/test$ eval $(cat data.txt | sed 's/ /=/g')
xxxxxx@ubuntu:~/test$ echo $AAA
10
xxxxxx@ubuntu:~/test$ cat cmd.txt | while read -r cmd data send; do eval echo "$cmd \$$data $send"; done
 SENDND 10
 SENDND 100

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.