我有像下一結構輸入文件:縮進線(樹)到路徑狀的線
a1
b1
c1
c2
c3
b2
c1
d1
d2
b3
b4
a2
a3
b1
b2
c1
c2
每級由2個空格縮進。所需的輸出是:
a1/b1/c1
a1/b1/c2
a1/b1/c3
a1/b2/c1/d1
a1/b2/c1/d2
a1/b3
a1/b4
a2
a3/b1
a3/b2/c1
a3/b2/c2
它就像一個文件系統,如果下一行有較大的缺口,當前的就像是一個「目錄」,當有相同縮進它就像一個「文件」。需要打印「文件」的完整路徑。
試圖解決這個沒有任何高級語言,如python
,perl
- 只有基本的bash命令。
我目前的代碼/想法是基於遞歸函數調用和使用堆棧,但有「邏輯」的問題。該代碼目前輸出下一個:
a1 b1 c1
a1 b1
a1
DD: line 8: [0-1]: bad array subscript
只有一號線是確定 - 所以在處理遞歸是錯誤的...
input="ifile.tree"
#stack array
declare -a stack
#stack manipulation
pushstack() { stack+=("$1"); }
popstack() { unset stack[${#stack[@]}-1]; }
printstack() { echo "${stack[*]}"; }
#recursive function
checkline() {
local uplev=$1
#read line - if no more lines - print the stack and return
read -r level text || (printstack; exit 1) || return
#if the current line level is largest than previous level
if [[ $uplev < $level ]]
then
pushstack "$text"
checkline $level #recurse
fi
printstack
popstack
}
# MAIN PROGRAM
# change the input from indented spaces to
# level_number<space>text
(
#subshell - change IFS
IFS=,
while read -r spaces content
do
echo $(((${#spaces}/2) + 1)) "$content"
done < <(sed 's/[^ ]/,&/' < "$input")
) | ( #pipe to another subshell
checkline 0 #recurse by levels
)
Sry基因的長碼 - 任何人可以幫助?
有什麼要放棄簡單的方法和尋找'試圖解決這個wi沒有任何高級語言,比如python,perl - 只有基本的bash命令。「# – BMW
設置了限制自我僅用於練習。 – BMW
@寶馬不理解你的觀點。簡單的''perl'也不''python'並且不知道awk。所以試着用我所知道的工具來解決問題。這有什麼問題?如果你可以用'awk'解決方案來幫助我,我會很高興......爲什麼選擇近距離投票? – cajwine