我有一个文档,我需要在其中动态创建/更新索引。我正在尝试使用 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/