如何使 AWK 使用在 Bash 脚本中创建的变量

发布于 2024-09-06 15:56:07 字数 513 浏览 5 评论 0原文

我的脚本看起来像这样

#!/bin/bash
#exampel inputfile is "myfile.txt"
inputfile=$1
basen=`basename $inputfile .txt`  # create basename

cat $inputfile | 
awk '{print $basen "\t" $3}  # this doesn't print "myfile" but the whole content of it.

我上面想做的是在 AWK 中打印出之前创建的名为“basen”的变量。 但不知何故,它未能达到我希望的效果。

因此,例如 myfile.txt 包含这些行

foo bar bax
foo qux bar

对于上面的 bash 脚本,我希望得到

myfile bax
myfile bar

正确的方法是什么?

I have script that looks like this

#!/bin/bash
#exampel inputfile is "myfile.txt"
inputfile=$1
basen=`basename $inputfile .txt`  # create basename

cat $inputfile | 
awk '{print $basen "\t" $3}  # this doesn't print "myfile" but the whole content of it.

What I want to do above is to print out in AWK the variable called 'basen' created before.
But somehow it failed to do what I hoped it will.

So for example myfile.txt contain these lines

foo bar bax
foo qux bar

With the above bash script I hope to get

myfile bax
myfile bar

What's the right way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

岛歌少女 2024-09-13 15:56:07

-v 标志用于从命令行设置变量。尝试这样的事情:

awk -v "BASEN=$basen" '{print BASEN "\t" $3}'

The -v flag is for setting variables from the command line. Try something like this:

awk -v "BASEN=$basen" '{print BASEN "\t" $3}'
风柔一江水 2024-09-13 15:56:07

你可以像这样使用它。

for i in `find $1 -name \*.jar`
do
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile
done

你应该使用

“'${i}'”

使用

$i

在 Bash 脚本中创建。

You can use it like this.

for i in `find $1 -name \*.jar`
do
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile
done

You should use

"'${i}'"

in AWK to use the

$i

created in Bash Script.

ぃ弥猫深巷。 2024-09-13 15:56:07

你可以在 awk 中完成所有操作

awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt

you can just do everything in awk

awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt
暗地喜欢 2024-09-13 15:56:07

假设您运行 awk 作为您声明变量的 shell 的子进程
在 shell 中

export MY_VARS="whatever"; #// IT NEEDS to be exported, to allow the sub process awk read access.
echo ""| awk '{
    print "Reading values from within awk : "ENVIRON["MY_VARS"];
}'

结果:

从 awk 中读取值:随便

注意到导出的重要性。如果没有它,则考虑来自 shell 的变量
本地的并且不会传递给协同进程。

Assuming you run awk as the sub process of the shell you declared the vars
Within the shell

export MY_VARS="whatever"; #// IT NEEDS to be exported, to allow the sub process awk read access.
echo ""| awk '{
    print "Reading values from within awk : "ENVIRON["MY_VARS"];
}'

Result:

Reading values from within awk : whatever

notice the importance of export. With out it, the vars from the shell is considered
local and does not get passed to the co-processes.

俏︾媚 2024-09-13 15:56:07

原因是 bash 变量(环境变量)不会在单引号字符串中扩展。尝试替换

'{print $basen "\t" $3}'

"{print \"$basen\" \"\t\" \$3}"

The reason is that bash variables (environment variables) are not expanded within single-quoted strings. Try replacing

'{print $basen "\t" $3}'

with

"{print \"$basen\" \"\t\" \$3}"
香橙ぽ 2024-09-13 15:56:07

最简单的方法是创建一个 awk 变量。 awk -v awkvar=$bashvar 'awkscript'

The easiest way is to make an awk variable. awk -v awkvar=$bashvar 'awkscript'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文