查找文件中的单词并使用 shell 脚本生成 .csv

查找文件中的单词并使用 shell 脚本生成 .csv

在不同的目录中存在许多具有这种结构的文件,这些文件的命名等于idea.js:

get.idea("tagIdea1","Some idea1 tag abc");
get.idea("idea1","Some idea1 description1 abc");
get.idea("tagIdea2","Some idea2 tag abc");
get.idea("idea2","Some idea2 description2 abc");
...
...

...就像这样...许多想法及其相应的想法描述。

有必要从每个 get.idea 函数获取第二个参数,并在与 idea.js 文件相同的目录中创建相应的 .csv 文件,并为每个找到的文件使用秒参数,如下所示:

Idea, descripcion
"Some idea1 tag abc","Some idea1 description1 abc"
"Some idea2 tag abc","Some idea2 description2 abc"

我认为使用 grep 命令和正则表达式将单词存储在数组中并在一个循环内增加每个想法的数量是可以完成的,但我不知道如何创建与每个想法的第二个参数匹配的正则表达式以及如何存储在一个数组中,稍后导出到一个新的 .csv 文件,其中提到的结构位于与 idea.js 文件相同的目录中。你能帮助我吗。

答案1

$ sed -n '/^get\.idea/s/^.*(\(.*\)).*/\1/;p' input | awk -F, 'BEGIN {print "Idea, Description";OFS=","} (NR % 2 ) == 1 {save=$2} (NR % 2) ==0 {print save, $2}'
Idea, Description
"Some idea1 tag abc","Some idea1 description1 abc"
"Some idea2 tag abc","Some idea2 description2 abc"

我们通常sed会去除所有不相关的内容,然后awk通过解析每隔一行来创建 CSV 文件。

答案2

与单awk命令:

awk 'BEGIN{ print "Idea, Description"; FS = OFS = "," }
     { desc = substr($2, 1, length($2) - 2) }
     { if ($1 ~ /"tag/){ tag = desc } else { print tag, desc } }' idea.js

输出:

Idea, Description
"Some idea1 tag abc","Some idea1 description1 abc"
"Some idea2 tag abc","Some idea2 description2 abc"

满足需求的扩展方法“在找到idea.js文件的同一目录中创建相应的 .csv 文件”:

创建idea_to_csv.awk脚本:

#!/bin/awk -f

BEGIN{ print "Idea, Description"; FS=OFS="," }
{ desc = substr($2, 1, length($2)-2) }
{ if ($1 ~ /"tag/){ tag = desc } else { print tag, desc } }

find . -type f -name "idea.js" -execdir sh -c 'awk -f ~/idea_to_csv.awk "$1" > idea.csv' _ {} \;

将路径更改为创建的~/idea_to_csv.awk实际位置idea_to_csv.awk

相关内容