2017-08-25 31 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

它的哪部分不清楚? –