cat、grep&;awk-读取行和;在1循环中读取文件时?

cat、grep&;awk-读取行和;在1循环中读取文件时?,awk,while-loop,grep,cat,Awk,While Loop,Grep,Cat,嗨 多亏了对stackoverflow(很棒的资源!)的大量搜索,过去几天我成功地做到了这一点,甚至成功地解决了以下问题,即每次运行命令时,输出都会导致行数加倍。多亏了awk命令,它能够删除双线。 我的搜索距离很远,但缺少一个选项。 顺便说一下,同时使用MacosX和linux 我试图做的是解析我的笔记(所有纯文本.md文件),在文本文件(称为greplist.txt)中搜索单词/标记,并解析与searchword/tag同名的单独文本文件中的匹配行(例如@computer.md) 选择grep

多亏了对stackoverflow(很棒的资源!)的大量搜索,过去几天我成功地做到了这一点,甚至成功地解决了以下问题,即每次运行命令时,输出都会导致行数加倍。多亏了awk命令,它能够删除双线。 我的搜索距离很远,但缺少一个选项。 顺便说一下,同时使用MacosX和linux

我试图做的是解析我的笔记(所有纯文本.md文件),在文本文件(称为greplist.txt)中搜索单词/标记,并解析与searchword/tag同名的单独文本文件中的匹配行(例如@computer.md)

选择greplist.txt的内容为:

@home
@computer
@Next
@Waiting
* do homework @computer [[school]]
* play videogame @computer [[fun]]
2.md文件的示例内容:

@home
@computer
@Next
@Waiting
* do homework @computer [[school]]
* play videogame @computer [[fun]]
school.md:

医学博士

使用这个终端命令(虽然效果很好,但还不够完美)

@home.md看起来像这样

* find lost schoolbooks @home
到目前为止,太棒了!已经非常非常高兴了。特别是由于添加了文件的移动/重命名,我还可以向@tag.md文件添加额外的任务/行,并将其包含在文件中,而不会在下次运行命令时被覆盖。令人惊叹的蛋糕

现在,我唯一遗漏的是,我希望在任务后面的@tag.md文件的输出中,也在搜索结果后面的括号中列出文件名(不带扩展名)(以便nvalt可以将其用作内部链接)

因此example@computer.md的期望输出将变成:

@home
@computer
@Next
@Waiting
* do homework @computer [[school]]
* play videogame @computer [[fun]]
我试着用grep命令中的-l和-H而不是-H来处理这个问题,但是输出结果却变得一团糟。(甚至还没有尝试添加括号!)

我试过的另一个方法是这个,但它不起任何作用。然而,它确实说明了我试图实现的目标

$ cat greplist.txt | while read line; do grep -h "$line" *.md | while read filename; do echo "$filename" >> $line.md.tmp; mv $line.md.tmp $line.md; awk '!x[$0]++' < $line.md > $line.md.tmp && mv $line.md.tmp $line.md ;done
$cat greplist.txt |在读取行时;读取文件名时执行grep-h“$line”*.md;执行echo“$filename”>>$line.md.tmp;mv$line.md.tmp$line.md;啊!x[$0]+'<$line.md>$line.md.tmp&&mv$line.md.tmp$line.md;完成
因此,津巴布韦百万美元的问题是:如何做到这一点。我试了又试,但这超出了我的技能水平。非常渴望找到解决方案

提前谢谢

丹尼尔·丹尼斯·德维特(Daniel Dennis de Wit)

试试这个:

grep -f greplist.txt *.md | awk ' match($0, /(.*).md:(.*)(@.*)/, vars) { print vars[2], "[[" vars[1] "]]" >> vars[3]".md.out"} '
它的作用是:

grep将在.md文件中的greplist.txt中输出匹配的模式:

最后,awk将以所需格式将文件名移到后面,并将每一行附加到相应的@.md.out*文件中:

* play videogame @computer [[fun]]
* find lost schoolbooks @home [[school]]
* do homework @computer [[school]]
我在文件名上添加了.out,以便下次执行命令时,它不会包含@*文件

注意我不确定awk脚本是否能在Mac OS X awk上运行。

试试这个:

grep -f greplist.txt *.md | awk ' match($0, /(.*).md:(.*)(@.*)/, vars) { print vars[2], "[[" vars[1] "]]" >> vars[3]".md.out"} '
它的作用是:

grep将在.md文件中的greplist.txt中输出匹配的模式:

最后,awk将以所需格式将文件名移到后面,并将每一行附加到相应的@.md.out*文件中:

* play videogame @computer [[fun]]
* find lost schoolbooks @home [[school]]
* do homework @computer [[school]]
我在文件名上添加了.out,以便下次执行命令时,它不会包含@*文件


注意我不确定awk脚本是否能在Mac OS X awk上运行。

大纲解决方案似乎是一种相当冗长的代码编写方法。此脚本使用
sed
编写
awk
脚本,然后运行
awk
,以便从标准输入读取其程序,并将其应用于所有不以
@
开头的“
.md
”文件

sed 's!.*!/&/ { name=FILENAME; sub(/\\.md$/, "", name); printf "%s [[%s]]\\n", $0, name > "&.md" }!' greplist.txt |
awk -f - [!@]*.md
Mac OS X上的
awk
版本将从标准输入读取其程序;GNU
awk
也将如此。因此,它使用的在管道上编写程序并从管道中读取程序的技术适用于这些版本。如果出现最坏情况,您必须将
sed
的输出保存到临时文件中,让
awk
从临时文件中读取程序,然后删除临时文件。直接将
sed
替换为
awk
,这样您将有一个
awk
进程编写
awk
程序,第二个
awk
进程执行该程序

生成的
awk
代码如下所示:

/@home/ { name=FILENAME; sub(/\.md$/, "", name); printf "%s [[%s]]\n", $0, name > "@home.md" }
/@computer/ { name=FILENAME; sub(/\.md$/, "", name); printf "%s [[%s]]\n", $0, name > "@computer.md" }
/@Next/ { name=FILENAME; sub(/\.md$/, "", name); printf "%s [[%s]]\n", $0, name > "@Next.md" }
/@Waiting/ { name=FILENAME; sub(/\.md$/, "", name); printf "%s [[%s]]\n", $0, name > "@Waiting.md" }
使用
sed
脚本中的code>只是选择一个未出现在生成的脚本中的字符。在每行上确定文件的基本名称不是“有效的”;如果文件足够大,可以添加一行,例如:

{ if (FILENAME != oldname) { name = FILENAME; sub(/\.md$/, "", name); oldname = FILENAME } }
awk
脚本的开头(您可以想出多少种方法?)。然后,您可以删除
name
的每行设置


不要试图在
@topic.md
文件上运行程序;这会导致混乱。

大纲解决方案似乎是编写代码的一种相当冗长的方式。此脚本使用
sed
编写
awk
脚本,然后运行
awk
,以便从标准输入读取其程序,并将其应用于所有不以
@
开头的“
.md
”文件

sed 's!.*!/&/ { name=FILENAME; sub(/\\.md$/, "", name); printf "%s [[%s]]\\n", $0, name > "&.md" }!' greplist.txt |
awk -f - [!@]*.md
Mac OS X上的
awk
版本将从标准输入读取其程序;GNU
awk
也将如此。因此,它使用的在管道上编写程序并从管道中读取程序的技术适用于这些版本。如果出现最坏情况,您必须将
sed
的输出保存到临时文件中,让
awk
从临时文件中读取程序,然后删除临时文件。将
sed
替换为
awk
,这样您就有了一个
awk
进程来编写