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在下面的代码中使用了PATH命令中的每个人,然后一次cp复制所有人的所有内容?NAMES

#!/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动态生成shell脚本:

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/"

然后运行该 shell 脚本。您可以将其合并到一个操作中:

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
============

相关内容