我想通过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...

===============>>#1 票数: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”)

===============>>#2 票数:1

根据OP的评论,没有必要存储匹配。 你可以这样做,使用awk的输出作为grep通过其他文件的输入。

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

===============>>#3 票数:1

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

awk '/foo/

然后筛选出第3列

awk '/foo/ {print $3

然后将aaa的每个实例分配给不同的变量。

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

===============>>#4 票数:0

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

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

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

===============>>#5 票数:0

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

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

这会将awk的输出分配给变量“value”,并为awk生成的每一行执行一次循环体。

  ask by user3219834 translate from so

未解决问题?本站智能推荐:

关注微信公众号