linux - awk 语法和字符串错误

标签 linux bash syntax awk

我目前正在尝试在文本文件 (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。

感谢您的帮助!

最佳答案

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

" 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}"

,将在任何(类似 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}" - 由于使用了 double 引号 - 首先被 shell 扩展,所以在 awk 即使看到该字符串,shell 也会将 $0 扩展为该标记的 its 定义(松散地说,交互式 shell 中的 shell 可执行文件,脚本中的脚本文件名)。

当从交互式(非登录)bash shell 运行时,这就是 awk 会看到的内容(分成多行只是为了便于阅读 - 注意单独的 tbash 代替 $0):

 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
  • 它允许您使用 " 而无需转义(如果您确实需要转义 nested 双引号 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

关于linux - awk 语法和字符串错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24658822/

相关文章:

linux - __blk_end_request 和 blk_end_request 之间的区别

python - 在 Python 和 Linux 中列出附近/可发现的蓝牙设备,包括已经配对的设备

linux - 从 x86 中的特定位置读取文件

linux - 我如何知道我是否在运行嵌套 shell?

matlab - 如何结束 MATLAB/Octave 函数定义?

android - 如何将 Android FTrace 精度提高到微秒?

docker中的bash文件没有执行

linux - 从 shell/bash 输出时髦的文件名?

c++ - 需要帮助来理解 C++ 语法

使用rust 中意外标记 `(' 附近的语法错误