我已经这样桑达文件存储在阵列
echo ${arr[@]}
1 13 19 30 34
阵列我想使用该阵列,以从其他文件的sed行(1,13,19,30和34)。我知道我可以使用循环,但我想知道是否有更直接的方法来做到这一点。到目前为止,我还没有做到。
感谢
我已经这样桑达文件存储在阵列
echo ${arr[@]}
1 13 19 30 34
阵列我想使用该阵列,以从其他文件的sed行(1,13,19,30和34)。我知道我可以使用循环,但我想知道是否有更直接的方法来做到这一点。到目前为止,我还没有做到。
感谢
sed的溶液:
a=(1 13 19 30 34)
sed -n "$(sed 's/[^[:space:]]*/&p;/g' <<< ${a[@]})" file
这将提取1,图13,19,30和第34行从file
它似乎在做我想做的事。谢谢 – biorunner88
@ biorunner88,不客气 – RomanPerekhrest
您可以使用AWK和系统功能运行sed命令
awk '{ for (i=1;i<=NF;i++) { system("sed -n \""$i"p\" filename") } }' <<< ${arr[@]}
这可以是开放的,虽然命令注入,因此相应地评估风险。
我不会冷静地回答@SO,但是我会说,你的答案值得一个。 – Kent
我确实倒过来了。 shell调用awk来调用system()来调用shell来调用sed是疯狂的。 –
可以执行单个在每一行的sed命令通过将命令和分号附加到每行,并将结果作为sed程序运行。这可以使用变量和数组中的bash模式替换以紧凑的方式进行管理;例如,打印选定的线,使用p
命令(-n
抑制打印未被选择的行):
sed -n "${arr[*]/%/p;}"
正常工作也与更复杂的命令等s/from/to/
:
sed "${arr[*]/%/s/from/to/;}"
这将执行只在选定的行上进行更换。
谢谢,它似乎也在工作。 – biorunner88
awk -v rows="${arr[*]}" 'BEGIN{split(rows,tmp); for (i in tmp) nrs[tmp[i]]} NR in nrs' file
请解释您的解决方案。 –
它的哪部分不清楚? –
你会在“另一个文件”的行/行上做什么? – Kent
只想根据数组索引将文件分成两部分。数组数字是行。 – biorunner88
@ biorunner88,略有不同。数字'1 13 19 30 34'应该如何帮助分割文件?你可以发布文件吗? – RomanPerekhrest