如何将awk输出分配给变量

时间:2014-04-19 22:45:05

标签: bash awk

我想通过file.txt搜索其中包含foo的所有行,然后过滤掉第3列(aaa colum),然后将每个aaa实例分配给不同的变量。
我已经过滤了aaa的所有实例,但它只是打印输出。有任何想法吗。我猜它必须是某种循环。我的例子如下。

grep foo file.txt | awk '{print $3}'

file.txt的

1. foo  bar1    aaa1    bbb1    ccc1

2. blablabla...

3. foo  bar2    aaa2    bbb2    ccc2

4. blablabla...

5. foo  bar3    aaa3    bbb3    ccc3

6. blablabla...

5 个答案:

答案 0 :(得分:1)

听起来你需要awk中的基本教程 - 谷歌搜索'awk教程'会给你一些。

awk '$1=="foo"{$3="someothervalue";}{print;}' file.text

应该按照你的要求做假设,假设“foo”总是在第1列,而aaa总是在第3列 - 不需要grep。有两个块,第一个将aaa值更新为标记为“foo”的记录的其他值,第二个块打印所有记录,包括修改(如果有)。

更新:或者如果你想要的是获得“aaa”的值,其中“foo”是关键的记录;你只是这样做

awk '$1=="foo"{print $3;}' file.text

这将只是找到标记为“foo”的所有记录并打印第3列(“aaa”)

答案 1 :(得分:1)

根据OP的评论,实际上并不需要存储匹配项。你可以这样做,使用awk的输出作为grep浏览其他文件的输入。

 awk '$3 ~ /aaa/ {print $3}' file.txt  | xargs -I {} grep {}  <OTHER_FILES_HERE>

答案 2 :(得分:1)

  

我想通过file.txt搜索找到foo的所有行

awk '/foo/
  

然后过滤掉第3列

awk '/foo/ {print $3
  

然后将aaa的每个实例分配给另一个变量。

  

aaa=($(awk '/foo/{print $3}' files
  echo ${aaa[0])

答案 3 :(得分:0)

我假设您的意思是要将值存储在shell环境变量中。 如果您确实想将值存储在变量中,可以使用eval来分配变量:

eval $(grep foo file.txt | awk '{count+=1; print "AAA"count"="$3";"}')

这为它找到的每个值创建一个单独的变量。

答案 4 :(得分:0)

merlin2011建议使用xargs是好的,但你也可以使用一个简单的shell循环并重用相同的变量名:

awk '/foo/{print $3}' |
while read value; do
  grep "$value" file
done

这会将awk的输出分配给变量&#34; value&#34;并为awk生成的每一行执行一次循环体。