如何在这样的代码中解析数组中的数字?

时间:2013-05-09 14:42:15

标签: linux shell sed awk

我需要解析代码中的数字:

p1 <- c(1, 2, 100, 23, 0.12, 0.03, 0)
p2 <- c(100, 200, 1, 23, 0.12, 0.03, 0)
p30 <- c(100, 200, 1, 23, 0.12, 0.03, 0)
p300 <- c(100, 200, 1, 23, 2, 1, 0)
more variables starts with p...
other codes...

结果是这样的:

1 2 100 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 2 1 0

其中每一行代表一个变量数组。

我尝试了sedawk,但没有解决问题。有没有人有这个想法?谢谢!

5 个答案:

答案 0 :(得分:2)

awk one-liner:

kent$  awk -F'[()]' '{gsub(/, */," ",$2)}$0=$2' file
1 2 100 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 2 1 0

答案 1 :(得分:2)

使用GNU sed(for -r和EREs):

$ cat file
p1 <- c(1, 2, 100, 23, 0.12, 0.03, 0)
p2 <- c(100, 200, 1, 23, 0.12, 0.03, 0)
p30 <- c(100, 200, 1, 23, 0.12, 0.03, 0)
p300 <- c(100, 200, 1, 23, 2, 1, 0)

$ sed -r 's/.*\(|[,)]//g' file
1 2 100 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 2 1 0

答案 2 :(得分:1)

awktr表示可读性; - )

awk -F'[()]' '{print $2}' file | tr -d ','

答案 3 :(得分:0)

假设你在文件t.txt中有它:

$ grep ^p t.txt|sed 's/.*[(]//; s/[)].*//; s/,//g'

1 2 100 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 2 1 0

答案 4 :(得分:0)

您可以在bash中执行此操作而无需调用外部程序。一个bash单行:

#!/usr/bin/bash

while read v; do v=${v#*(}; v=${v%)*}; echo ${v//, / }; done<<XXX
p1 <- c(1, 2, 100, 23, 0.12, 0.03, 0)
p2 <- c(100, 200, 1, 23, 0.12, 0.03, 0)
p30 <- c(100, 200, 1, 23, 0.12, 0.03, 0)
p300 <- c(100, 200, 1, 23, 2, 1, 0)
XXX

输出:

1 2 100 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 0.12 0.03 0
100 200 1 23 2 1 0