2017-08-25 65 views
2

我已經這樣桑達文件存儲在陣列

echo ${arr[@]} 
1 13 19 30 34 

陣列我想使用該陣列,以從其他文件的sed行(1,13,19,30和34)。我知道我可以使用循環,但我想知道是否有更直接的方法來做到這一點。到目前爲止,我還沒有做到。

感謝

+0

你會在「另一個文件」的行/行上做什麼? – Kent

+0

只想根據數組索引將文件分成兩部分。數組數字是行。 – biorunner88

+0

@ biorunner88,略有不同。數字'1 13 19 30 34'應該如何幫助分割文件?你可以發佈文件嗎? – RomanPerekhrest

回答

2

sed的溶液:

a=(1 13 19 30 34) 
sed -n "$(sed 's/[^[:space:]]*/&p;/g' <<< ${a[@]})" file 

這將提取1,圖13,19,30和第34行從file

+0

它似乎在做我想做的事。謝謝 – biorunner88

+0

@ biorunner88,不客氣 – RomanPerekhrest

-1

您可以使用AWK和系統功能運行sed命令

awk '{ for (i=1;i<=NF;i++) { system("sed -n \""$i"p\" filename") } }' <<< ${arr[@]} 

這可以是開放的,雖然命令注入,因此相應地評估風險。

+2

我不會冷靜地回答@SO,但是我會說,你的答案值得一個。 – Kent

+1

我確實倒過來了。 shell調用awk來調用system()來調用shell來調用sed是瘋狂的。 –

2

可以執行單個在每一行的sed命令通過將命令和分號附加到每行,並將結果作爲sed程序運行。這可以使用變量和數組中的bash模式替換以緊湊的方式進行管理;例如,打印選定的線,使用p命令(-n抑制打印未被選擇的行):

sed -n "${arr[*]/%/p;}" 

正常工作也與更復雜的命令等s/from/to/

sed "${arr[*]/%/s/from/to/;}" 

這將執行只在選定的行上進行更換。

+0

謝謝,它似乎也在工作。 – biorunner88

1
awk -v rows="${arr[*]}" 'BEGIN{split(rows,tmp); for (i in tmp) nrs[tmp[i]]} NR in nrs' file 
+0

請解釋您的解決方案。 –

+0

它的哪部分不清楚? –