grep은 텍스트 파일의 항목을 분리하여 다른 명령에 포함시킵니다.

grep은 텍스트 파일의 항목을 분리하여 다른 명령에 포함시킵니다.

내 컴퓨터에는 개인 데이터베이스와 파일 경로가 저장되어 있습니다. 이 데이터는 다음과 같이 (매우 긴) 구분된 텍스트 파일로 저장됩니다.

============
NAME: John
TIME: 12:31:25
PATH: ./a/b/v/c   #to some data related to the person
============
NAME: Jo
TIME: 11:21:11
PATH: ./c/s/d/f   #to some data related to the person 
============
NAME: Je
TIME: 10:51:15
PATH: ./q/n/h/l   #to some data related to the person
============

......  # very long list of entries in this format.

NAME각 항목이 포함된 폴더를 만든 다음 그 안에 있는 모든 항목을 폴더 PATH에 복사하고 싶습니다 OUTPUT. 명령의 모든 사람 grep에 대해 아래 코드를 사용한 다음 모든 사람을 위해 모든 것을 한 번에 복사하고 있습니까 ?PATHcpNAMES

#!/bin/bash -f
source=PATH TO THIS TEXT DELIMITED FILE (log.log)
grep -o 'NAME.*' ./log.log | cut -f2- -d':'> ./name.log; 
grep -o 'PATH.*' ./log.log | cut -f2- -d':'> ./path.log; 
for i in $(cat ./name.log);do
mkdir ./${i};
    for ii in $(cat ./path.log); do 
(
      cp ${ii}/*.* ./${i}
done
)&
done

저는 코딩 경험이 거의 없기 때문에 이 코드가 너무 복잡하다고 생각합니다. 이를 단순화하는 방법에 대한 조언이 필요합니까?

답변1

이런 식으로 시도해 볼 수도 있겠네요...

먼저 awk동적으로 생성된 쉘 스크립트를 사용하십시오.

awk '
  /NAME:/ {
    name=gensub(/\"/, "", "g", substr($0, 7))
  }
  /PATH:/ {path=$2}
  name && /=====/ {
    printf "mkdir \"%s\"\n", name
    printf "rsync -a \"%s/\" \"%s/\"\n", path, name
  }
'

귀하의 입력에 따라 다음이 생성됩니다.

rsync -a "./a/b/v/c/" "John/"
rsync -a "./c/s/d/f/" "Jo/"
rsync -a "./q/n/h/l/" "Je/"

그런 다음 쉘 스크립트를 실행하십시오. 이를 하나의 작업으로 결합할 수 있습니다.

awk '
  /NAME:/ {
    name=gensub(/\"/, "", "g", substr($0, 7))
  }
  /PATH:/ {path=$2}
  name && /=====/ {
    printf "mkdir \"%s\"\n", name
    printf "rsync -a \"%s/\" \"%s/\"\n", path, name
  }
'

여기서는 내용을 복사하는 데 사용하고 있지만 rsync물론 cp -r.

또한 귀하의 코드에서 *.*.

고쳐 쓰다

작동하도록 수정했습니다.

============
NAME: "John Frederick"
TIME: 12:31:25
PATH: ./a/b/v/c   #to some data related to the person
============

관련 정보