【问题标题】:awk syntax and string errorawk 语法和字符串错误
【发布时间】:2014-08-30 18:46:40
【问题描述】:

我目前正在尝试在文本文件 (temp.txt) 的每一行的开头添加一个新字符串,并使用 awk 创建一个包含组合文本的新文件 (newtemp.txt)。

我的代码是:

awk  " NR>1{printf \"=HYPERLINK(B%d, C%d) "\t" https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=%s\n\", NR-1, NR-1, $0}" temp.txt > untemp.txt

它正在创建一个名为 untemp.txt 的新文件,该文件仅包含字符串。
例如:

--------------------------------------------------------------------------------
=HYPERLINK(B2, C2)  https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=
--------------------------------------------------------------------------------
=HYPERLINK(B3, C3)  https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=
--------------------------------------------------------------------------------
=HYPERLINK(B4, C4)  https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=
etc...

我希望它在 temp.txt 中每一行的开头添加上面的字符串。
它适用于 gawk 但不适用于 awk。
什么是正确的语法,我使用的是 Linux shell。

感谢您的帮助!

【问题讨论】:

  • +1 显然是在尝试使用 awk 操作电子表格。
  • awk ' NR>1{printf "=HYPERLINK(B%d, C%d) \t https://otrs.confidental/index.pl?Action=AgentTicketZoom;TicketID=%s\n", NR-1, NR-1, $0} ' temp.txt > newtemp.txt 在 Mac 上为我工作
  • 是的,它在 gawk(windows GNU shell)中对我有用,但在 awk(Linux shell)中对我有用。我编辑了表单,告诉我它现在是否有效并重新阅读
  • 成功了!谢谢!!! @GolgiDevang
  • 不用担心。很高兴能提供帮助。

标签: linux bash syntax awk


【解决方案1】:

我不认为你的原始字符串,

" NR>1{printf \"=HYPERLINK(B%d, C%d) "\t" https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=%s\n\", NR-1, NR-1, $0}"

,可以在 any(类 Bourne)shell 中作为 awk 程序工作:

您的字符串由 3 个单独的字符串组成连接形成一个字符串:

  • 第 1 部分" NR>1{printf \"=HYPERLINK(B%d, C%d) "
    • 这部分将发生未经修改地传递给awk - 请参阅下面的第 3 部分。
  • 第 2 部分\t 是一个不代表字符的未引用 字符串;相反,shell 将其解释为 just t(它“吃掉”\),并且只有 t 被附加到第 1 部分。
  • 第 3 部分" https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=%s\n\", NR-1, NR-1, $0}" - 由于使用了 引号 - 首先由 shell 扩展,因此在 awk 甚至看到字符串之前,shell 将$0 扩展为该标记的its 定义(简单地说,交互式shell 中的shell 可执行文件,脚本中的脚本文件名)。

当从交互式(非登录)bash shell 运行时,这是 awk 会看到的内容(为了可读性而分成多行 - 请注意单独的 tbash 代替 @987654336 @):

 NR>1{printf "=HYPERLINK(B%d, C%d) t 
 https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=%s\n", 
 NR-1, NR-1, bash}

显然不是你想要的。


正如@GolgiDevang 已在评论中发布的那样,解决方法是在整个字符串周围使用单个引号,这通常是awk 程序的最佳选择

  • 它可以防止 shell 在将字符串传递给awk 之前应用不需要的扩展。
    • 使用双引号,混淆的可能性很大,因为$ 前缀标记在shell 和awk 中都有意义。
    • 如果您确实需要传递 shell 变量以在awk 程序中使用,请使用-v 选项;例如:-v var="$var" - 这定义了 awk 变量 var,其值为 shell 变量 $var
  • 它允许您使用" 而无需转义(如果您确实需要转义嵌套双引号awk,请使用\")。

因此(您的意思是每个都用空格包围吗?):

awk 'NR>1{printf "=HYPERLINK(B%d, C%d) \t https://otrs.city.pittsburgh.pa.us/index.pl?Action=AgentTicketZoom;TicketID=%s\n", NR-1, NR-1, $0}' temp.txt > untemp.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 2021-09-07
    • 1970-01-01
    • 2020-07-20
    • 2013-11-14
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多