【问题标题】:awk function printing..... -bash?awk 函数打印..... -bash?
【发布时间】:2012-10-01 06:27:25
【问题描述】:

出于某种原因,我试图弄清楚我正在从这个脚本中打印出“-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-定义另一个动作,在这种情况下只是打印数组中的第一项

有什么建议吗?谢谢你!

【问题讨论】:

  • 请不要使用cat,这是不必要的——awk 将文件名作为参数。

标签: bash awk


【解决方案1】:

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

您需要引用 $0 以便 shell 不会扩展它,并且 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

【讨论】:

  • 嗨乔纳森,你写的第二个版本非常感谢你,但是第一个,分配变量 'al=$0' 的版本仍然有一些问题,赋值 'al=$0' 为变量 'al' 赋予了 '$0' 的值(字面意思)。该数组的大小为 1 和 a[1] 中的“$0”,
  • 是的,这就是我在回答中告诉您的内容,您阅读了吗? "这样在程序开始时将变量al 设置为字符串"$0""
【解决方案2】:

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

【讨论】:

  • 嗯??我以为它会读取 cat sample | 提供的数据
  • $0 默认指向当前使用的程序,但据我所知,在 awk 脚本中,$0 参数“应该”指向正在读取的整行。
  • 我不确定 awk,但 $0 出现在 awk 脚本之外,因此它会被 shell 解释。
【解决方案3】:

错误...

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

【讨论】:

  • 正在使用 split 函数,它给出了一个数组,事实上它在一个简单的打印操作中使用的数组纯粹是为了测试目的,我在第一个问题中添加了这个。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多