我目前正在尝试在文本文件 (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 将其解释为 justt
(它“吃掉”了\
),并且只有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
会看到的内容(分成多行只是为了便于阅读 - 注意单独的 t
和 bash
代替 $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/