awk功能打印..... -bash?

时间:2012-09-30 19:19:37

标签: bash awk

由于某些原因,我试图弄清楚我正在从这个剧本中打印出“-bash”:

cat sample | awk -v al=$0 -F"|" '{n = split(al, a, "|")} {print a[1]}'

'sample'文件包含psv“管道分离值”,如| b | c | d | e | f | d。
我的目的是使用数组 上面脚本的结果是一个长度为1的数组,只有包含的项是“-bash”,即shell的名称。
$ 0默认指向当前使用的程序,但据我所知,在awk脚本中,$ 0参数'should'指向正在读取的整行。

因为我想知道问题在哪里“我是bash / awk的新手” 你能指出我以下哪些步骤失败了吗? 1-“连接”示例文件并将其作为awk脚本的输入传递 2 - 定义一个名为'al'的变量,其值为'sample'中包含的每一行的值 3 - 定义管道“|”作为现场分离器
4 - 定义一个动作,使用管道作为拆分器将“al”的值拆分为名为“a”的数组 5 - 定义另一个动作,在这种情况下只是打印数组中的第一个项目

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:2)

$0在运行awk之前由shell进行扩展,$0是当前程序的名称,bash-一开始是因为bash是由 login(1)运行的(参见execman bash内置的描述)

您需要引用$0,以便shell不会展开它,并且awk会看到它:

awk -v 'al=$0' -F"|" '{n = split(al, a, "|")} {print a[1]}' sample

但是读取任何数据之前处理变量赋值,因此在程序开始时将变量al设置为字符串“$ 0”,它不< / em>将al设置为每个输入记录的内容。

如果您想要记录,只需这样说而不是使用变量:

awk -F"|" '{n = split($0, a, "|")} {print a[1]}' sample

答案 1 :(得分:1)

-v a1=$0,您将a1设置为当前程序的名称,即bash。请参阅man bash中的参数

答案 2 :(得分:0)

... ERR

awk -F'|' '{ print $1 }' sample