gpt4 book ai didi

bash - awk 动态文档索引

转载 作者:行者123 更新时间:2023-11-29 08:56:13 25 4
gpt4 key购买 nike

我有一个文档,我需要在其中动态创建/更新索引。我正在尝试使用 awk 来完成它。我有一个部分工作示例,但现在我被难住了。

示例文档如下。

numbers.txt:
#) Title
#) Title
#) Title
#.#) Subtitle
#.#.#) Section
#.#) Subtitle
#) Title
#) Title
#.#) Subtitle
#.#.#) Section
#.#) Subtitle
#.#.#) Section
#.#.#.#) Subsection
#) Title
#) Title
#.#) Subtitle
#.#.#) Section
#.#.#.#) Subsection
#.#.#.#) Subsection

期望的输出是:

1) Title
2) Title
3) Title
3.1) Subtitle
3.1.1) Section
3.2) Subtitle
4) Title
5) Title
5.1) Subtitle
5.1.1) Section
5.2) Subtitle
5.2.1) Section
5.2.1.1) Subsection
6) Title
7) Title
7.1) Subtitle
7.1.1) Section
7.1.1.1) Subsection
7.1.1.2) Subsection

我拥有的部分工作的 awk 代码如下。

numbers.sh:
awk '{for(w=1;w<=NF;w++)if($w~/^#\)/){sub(/^#/,++i)}}1' number.txt

如有任何帮助,我们将不胜感激。

最佳答案

我已经为您实现了一个AWK 脚本!而且它仍然适用于超过四个级别的索引! ;)

我将尝试用内联注释对其进行一些解释:

#!/usr/bin/awk -f

# Clears the "array" starting from "from"
function cleanArray(array,from){
for(w=from;w<=length(array);w++){
array[w]=0
}
}

# This is executed only one time at beginning.
BEGIN {
# The key of this array will be used to point to the "text index".
# I.E., an array with (1 2 2) means an index "1.2.2)"
array[1]=0
}

# This block will be executed for every line.
{
# Amount of "#" found.
amount=0

# In this line will be stored the result of the line.
line=""

# Let's save the entire line in a variable to modify it.
rest_of_line=$0

# While the line still starts with "#"...
while(rest_of_line ~ /^#/){

# We remove the first 2 characters.
rest_of_line=substr(rest_of_line, 3, length(rest_of_line))

# We found one "#", let's count it!
amount++

# The line still starts with "#"?
if(rest_of_line ~ /^#/){
# yes, it still starts.

# let's print the appropiate number and a ".".
line=line""array[amount]
line=line"."
}else{
# no, so we must add 1 to the old value of the array.
array[amount]++

# And we must clean the array if it stores more values
# starting from amount plus 1. We don't want to keep
# storing garbage numbers that may harm our accounting
# for the next line.
cleanArray(array,amount + 1)

# let's print the appropiate number and a ")".
line=line""array[amount]
line=line")"
}
}

# Great! We have the line with the appropiate indexes!
print line""rest_of_line
}

所以,如果您将它保存为script.awk,那么您可以执行它并为该文件添加执行权限:

chmod u+x script.awk

最后,你可以执行它了:

./script.awk <path_to_number.txt>

例如,如果您将脚本 script.awk 保存在文件 number.txt 所在的同一目录中,然后,将目录更改为该目录并执行:

./script.awk number.txt

所以,如果您有这个 number.txt

#) Title
#) Title
#) Title
#.#) Subtitle
#.#.#) Section
#.#) Subtitle
#) Title
#) Title
#.#) Subtitle
#.#.#) Section
#.#) Subtitle
#.#.#) Section
#.#.#.#) Subsection
#) Title
#) Title
#.#) Subtitle
#.#.#) Section
#.#.#.#) Subsection
#.#.#.#.#) Subsection
#.#.#.#.#) Subsection
#.#.#.#.#) Subsection
#.#.#.#.#.#) Subsection
#.#.#.#.#) Subsection
#.#.#.#.#.#) Subsection
#.#.#.#.#.#) Subsection
#.#.#.#.#.#) Subsection
#.#.#.#.#.#) Subsection
#.#.#.#.#) Subsection
#.#.#.#) Subsection
#.#.#) Section

这将是输出(注意解决方案不受“#”数量的限制):

1) Title
2) Title
3) Title
3.1) Subtitle
3.1.1) Section
3.2) Subtitle
4) Title
5) Title
5.1) Subtitle
5.1.1) Section
5.2) Subtitle
5.2.1) Section
5.2.1.1) Subsection
6) Title
7) Title
7.1) Subtitle
7.1.1) Section
7.1.1.1) Subsection
7.1.1.1.1) Subsection
7.1.1.1.2) Subsection
7.1.1.1.3) Subsection
7.1.1.1.3.1) Subsection
7.1.1.1.4) Subsection
7.1.1.1.4.1) Subsection
7.1.1.1.4.2) Subsection
7.1.1.1.4.3) Subsection
7.1.1.1.4.4) Subsection
7.1.1.1.5) Subsection
7.1.1.2) Subsection
7.1.2) Section

希望对你有帮助!

关于bash - awk 动态文档索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34125552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com