如何从行或数据库中提取字符串,数字或单词并将其保存到变量? (bash中的脚本)

时间:2013-11-08 16:50:34

标签: sed awk grep cat

我的问题可以拆分为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'?

3 个答案:

答案 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[@]}"

xy被声明为数组。然后循环输入文件并向输入文件中的每个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]}访问,同样适用于其他变量序列。