키:값으로 파일 형식을 지정하는 데 도움이 필요합니다. [중복]

키:값으로 파일 형식을 지정하는 데 도움이 필요합니다. [중복]

다음 값을 가진 파일이 있습니다.

고양이 데이터.txt

server1: 'calv'
server2: 'anot'
log: '/u/log/1'
server3: 'calv'
server4: 'anot'
server5: 'secd'
server6: 'calv'
LIB_TRGT_calv,anot: '/tmp/hello.txt'
LIB_TRGT_secd: '/var/del.tmp'

_TRGT_LIB_TRGT_calv,anot즉 &를 포함하는 변수를 얻습니다 .LIB_TRGT_secd

참고: 변수 이름은 다를 수 있습니다.DB_TRGT_<whatever>

_TRGT_calv,anotie 및 위의 변수에서 그 뒤에 이름을 가져와야 합니다 secd.

이제 && 가 있는 모든 항목을 calv & anot & secd가져와서 다음 과 같이 발견된 항목을 data.txt에 추가해야 합니다.calvanotsecd

원하는 출력:

server1: 'calv'
server2: 'anot'
log: '/u/log/1'
server3: 'calv'
server4: 'anot'
server5: 'secd'
server6: 'calv'
LIB_TRGT_calv,anot: '/tmp/hello.txt'
LIB_TRGT_secd: '/var/del.tmp'
LIB_server1:  '/tmp/hello.txt'
LIB_server2:  '/tmp/hello.txt'
LIB_server3:  '/tmp/hello.txt'
LIB_server4:  '/tmp/hello.txt'
LIB_server6:  '/tmp/hello.txt'
LIB_server5: '/var/del.tmp'

지금까지 내가 한 일은 다음과 같습니다.

grep TRGT* data.txt | cut -d: -f1 |cut -d_ -f3
calv,anot
secd

더 멀리

grep TRGT* test.txt | cut -d: -f1 |cut -d_ -f3 | sed -n 1'p' | tr ',' '\n'
calv
anot

xargs어떻게 사용 하고 계속 진행해야 할지 모르겠습니다 .

답변1

이것은 YAML이므로 YAML 파서를 사용합니다 yq.https://kislyuk.github.io/yq/

주어진 입력 데이터 file와 짧은 스크립트 script:

$ yq -y -f script file
server1: calv
server2: anot
log: /u/log/1
server3: calv
server4: anot
server5: secd
server6: calv
LIB_TRGT_calv,anot: /tmp/hello.txt
LIB_TRGT_secd: /var/del.tmp
LIB_server1: /tmp/hello.txt
LIB_server2: /tmp/hello.txt
LIB_server3: /tmp/hello.txt
LIB_server4: /tmp/hello.txt
LIB_server5: /var/del.tmp
LIB_server6: /tmp/hello.txt

이 작업은 jq다음 스크립트( yqJSON 파서 주변의 YAML 래퍼 jq)를 사용하여 수행됩니다.

with_entries(
        select(.key | test("_TRGT_")) |
        .value as $v |
        .key | sub(".*_TRGT_"; "") | split(",")[] |
        { key: ., value: $v }
) as $map |
. += with_entries(
        select(.value | in($map)) |
        { key: ("LIB_" + .key), value: $map[.value] }
)

$map먼저 질문의 데이터를 기반으로 _TRGT_원본 데이터의 키에서 구문 분석된 경로 이름과 특수 키 값 사이의 간단한 매핑이 될 JSON 객체를 계산합니다 .

{                         
  "calv": "/tmp/hello.txt",
  "anot": "/tmp/hello.txt",
  "secd": "/var/del.tmp"
}                          

이 객체 $map의 키에 해당하는 원본 데이터의 각 값 에 대해 값의 키에서 계산된 키와 해당 항목에서 가져온 값을 사용하여 새 항목이 생성됩니다 $map.

관련 정보