我正在嘗試做一個遞回的awk。目標是能夠要求 4 并得到 4 5 6 7
testfile.csv 看起來像這樣:
From,To
2,3
1,2
4,5
3,4
5,6
6,7
0,1
如果我省略了遞回部分,我的 awk 代碼就可以作業,但是當我運行它時:
#!/bin/bash
path()
{
if [ -z "$1" ]; then
echo " _"
else
last= $(path $(awk -v myvar="$1" -F"," '$1 ~ myvar { print $2 }' testfile.csv))
echo $(( last ))
fi
}
path $1
我得到的是:
$ bash path 4
path: line 8: awk -v myvar=4 -F, '4 ~ myvar { print }' testfile.csv: syntax error in expression (error token is "myvar=4 -F, '4 ~ myvar { print }' testfile.csv")
0
我已經閱讀了有關該主題的所有內容。我可以做 awk 或遞回,但我不能讓它們一起作業。
有任何想法嗎?謝謝
uj5u.com熱心網友回復:
一種高效、強大、便攜的方式來做你想做的事情是:
path() {
awk -v cur="$1" '
BEGIN { FS="," }
{ map[$1] = $2 }
END {
out = cur
while ( cur in map ) {
nxt = map[cur]
out = out OFS nxt
delete map[cur]
cur = nxt
}
print out
}
' testfile.csv
}
path 4
4 5 6 7
這將比使用遞回 shell 函式快幾個數量級。這delete map[cur]
是為了防止資料中的無限遞回,例如4,5
和5,4
。
uj5u.com熱心網友回復:
為了補充Ed 寫的內容,這里是一個純 bash 實作:
#!/usr/bin/env bash
declare -a map=()
while IFS=, read -r k v; do
map[k]=$v
done
ppat () {
cur=$1
local -a out=("$cur")
while [[ -v map["$cur"] ]]; do
nxt=${map[$cur]}
out =("$nxt")
unset map["$cur"]
cur=$nxt
done
printf '%s\n' "${out[*]}"
}
ppat "$1"
使用示例:
$ bash script.sh 4 < testfile.csv
4 5 6 7
uj5u.com熱心網友回復:
path(){
awk -v m="$1" '
{ gsub(","," ");
printf m FS;
for(i=1; i<=NF; i =2) {if($(i) == m){ m=$(i 1); printf m FS}};
printf "\n"
}' <(sort input_file|tr '\n' ' ')
}
path 4
4 5 6 7
path 2
2 3 4 5 6 7
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470042.html
下一篇:遞回寫入記憶體中的字串:Java