我的问题可以拆分为2.首先我有一个数据文件(file.dat),如下所示:
Parameter stuff number 1 (1029847) word index 2 (01293487), bla bla
Parameter stuff number 3 (134123) word index 4 (02983457), bla bla
Parameter stuff number 2 (109847) word index 3 (1029473), bla bla
etc...
我想在括号中提取数字并将其保存到变量中,例如第一行中的第一个变为'x1',第二行在同一行上为'y1',第二行'x2'和'y2',依此类推......数字随机逐行变化,它们的位置(在列中,如果你愿意的话)保持一行一行。行数是可变的(0到'n')。我怎样才能做到这一点?请。
我已经找到了答案而且我迷失了许多可以使用的不同命令,但是这些答案会关注特定的例子,其中这个词在最后或在括号中,但每行只有一个,等等。无论如何,这里是到目前为止我做了什么(我是新手):
1)我摆脱了不属于字符串
中数字的字符sed -i 's/(//g' file.dat
sed -i 's/),//g' file.dat
2)出于沮丧,我决定将整行输出到变量(越来越近了?) 2.1)获取迭代的行数:
numlines=$(wc -l < file.dat)
2.2)循环到numlines(我还没测试过这个位!)
for i in {1..$numlines}
do
line${!i}=$(sed -n "${numlines}p" file.dat)
done
2.3)我放弃了这里,感谢任何帮助。
第二个问题是类似的,仅仅是出于好奇:想象一个由空格,制表符或彗星,任何分隔符分隔的数据库;此数据库具有可变数量的行('n'),每行的字符串也可能不同('k')。如何在'j'字符串中提取'i'行的值,并将其保存为变量'x'?
答案 0 :(得分:3)
这是一种在bash数组变量中存储值的快捷方法。
x=("" $(awk -F"[()]" '{printf "%s ",$2}' file))
y=("" $(awk -F"[()]" '{printf "%s ",$4}' file))
echo ${x[2]}
134123
如果您打算将这些数据用于更多工作,我会在awk
中完成。然后,您可以在awk
awk -F"[()]" '{x[NR]=$2;y[NR]=$4}' file
答案 1 :(得分:2)
#!/usr/bin/env bash
x=()
y=()
while read line; do
x+=("$(sed 's/[^(]*(\([0-9]*\)).*/\1/' <<< $line)")
y+=("$(sed 's/[^(]*([^(]*(\([0-9]*\)).*/\1/' <<< $line)")
done < "data"
echo "${x[@]}"
echo "${y[@]}"
x
和y
被声明为数组。然后循环输入文件并向输入文件中的每个sed
调用line
命令。
x+=(data)
将值data
附加到数组x
。我们使用命令替换而不是写入我们想要存储在数组中的值,而不是将$(command)
的字面含义附加到数组,命令执行并且返回值存储在数组中。
让我们看一下$(command)
命令:
's'是替换命令,sed
我们希望匹配除[^(]*
之外的所有内容,然后匹配(
。我们要在数组中存储以下字符,为此我们使用(
和\(
,我们稍后可以再次引用它(使用\)
)。该号码与\1
匹配。最后,我们将结束括号[0-9]*
和其他所有内容与)
匹配。然后我们使用.*
替换我们匹配的所有内容(整行),这正是\1
和\(
之间的内容。
如果您是\)
的新用户,这可能会非常混乱,因为阅读sed
语法需要一些时间。
第二个sed
命令非常相似。
答案 2 :(得分:1)
如何在'j'字符串中提取'i'行的值,以及 将它保存到变量'x'?
尝试使用awk
x=$(awk -v i=$i -v j=$j ' NR==i {print $j; exit}' file.dat)
我想在括号中提取数字并将其保存到变量中 例如,第一行中的第一个是'x1',第二个是相同的 对于第2行'x2'和'y2',行为'y1',依此类推...
使用awk
x=($(awk -F'[()]' '{print $2}' file.dat))
y=($(awk -F'[()]' '{print $4}' file.dat))
x1
可以${x[0]}
和y1
作为${y[0]}
访问,同样适用于其他变量序列。