我想通过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...
答案 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生成的每一行执行一次循环体。