0

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

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

“样本”文件包含 psv“管道分隔值”,如 a|b|c|d|e|f|d。
我的意图是使用数组。
上述脚本的结果是一个长度为 1 的数组,其中包含的唯一项是“-bash”,即 shell 的名称。
默认情况下,$0 指向当前使用的程序,但据我所知,在 awk 脚本中,$0 参数“应该”指向正在读取的整行。

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

有什么建议吗?谢谢你!

4

3 回答 3

2

运行前$0被shell扩展,awk$0当前程序的名称,即bash-开头的 是因为bash是通过login(1)运行的(见exec内置的描述man bash

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

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

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

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

awk -F"|" '{n = split($0, a, "|")} {print a[1]}' sample
于 2012-09-30T22:27:25.067 回答
1

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

于 2012-09-30T19:24:54.293 回答
0

呃...

awk -F'|' '{ print $1 }' sample
于 2012-09-30T19:24:41.127 回答