由于某些原因,我试图弄清楚我正在从这个剧本中打印出“-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 - 定义另一个动作,在这种情况下只是打印数组中的第一个项目
有什么建议吗?谢谢!
答案 0 :(得分:2)
$0
在运行awk
之前由shell进行扩展,$0
是当前程序的名称,bash
,-
一开始是因为bash是由 login(1)运行的(参见exec
中man 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