【问题标题】:gnuplot awk/bash escaping quotinggnuplot awk/bash 转义引用
【发布时间】:2020-06-04 14:04:58
【问题描述】:

更新:

我有这个 awk 命令,我想嵌套到一个 system("") 命令中。 awk ' BEGIN {yr=2016} !/^#/ && NF!=0 { for(i=2;i<=NF;i++) a[i]+=$i } END { for (y=2;y<=NF;y++) print yr++ " - (" a[y] " Loads)" }' vol.dat

所以我尝试了这个: system("awk ' BEGIN {yr=2016} !/^#/ && NF!=0 { for(i=2;i<=NF;i++) a[i]+=$i } END { for (y=2;y<=NF;y++) print yr++ \" - (\" a[y] \" Loads)\" }' vol.dat")

由于嵌套,Bash 不喜欢它,而且我显然没有正确转义引号。但是我尝试转义我无法用空格打印的字符。

这是一些示例输入,但正如我所说,这不是 awk 问题,而是 awk 命令嵌套在双引号和转义字符中的问题:

vol.dat
Jan 0   165 165 228 78  
Feb 10  52  149 196 79  
Mar 46  186 159 137 182

Output:
2016 (56 Loads)
2017 (403 Loads)
2018 (473 Loads)
2019 (561 Loads)
2020 (339 Loads)

【问题讨论】:

  • 我无法重现此问题。您能否为我们提供一个造成此问题的最小示例?小版vol.dat
  • edit 你的问题包括minimal reproducible example 简洁、可测试的样本输入和预期输出。见How to Ask。您应该以从 sh -c "..." 调用 awk 为示例,而不是从 gnuplot 的 system("...") 调用,因为相对较少的人会使用后者进行测试,并且几乎可以肯定两者都存在相同的问题。
  • Output 是你得到的输出还是你想要的输出?请确保向我们展示您想要的输出。

标签: bash awk escaping gnuplot


【解决方案1】:

我没有gnuplot,所以无法根据你的问题对其进行测试,将awk命令更改如下,请你试试看。

totals = system("awk ' BEGIN {yr=2016} !/^#/ && NF!=0 { for(i=2;i<=NF;i++) a[i]+=$i } END { for (y=2;y<=NF;y++) print yr++ OFS a[y] OFS \"Loads)\" }' vol.dat")

我们实际上可以在变量之间的print 语句中使用逗号以在它们之间留出空格,因为awk 的输出字段分隔符默认为空格,但由于我不确定, 在gnuplot 中的行为,所以添加@ 987654326@这里也是一种节奏空间的方式。

【讨论】:

  • 不,我得到以下信息:totals = system(awk ' BEGIN {yr=2016} !/^#/ && NF!=0 { for(i=2;i<=NF;i++) a[i]+=$i } END { for (y=2;y<=NF;y++) print yr++ OFS a[y] OFS \"Loads)\" }' vol.dat) ^ "./plotFancy.pg", line 45: ')' expected
  • @charlie0440,哦,在复制您的尝试时 " 错过了您现在可以尝试,请让我知道它是怎么回事。
【解决方案2】:

这基本上是你想要做的吗?

$ sh -c "awk 'BEGIN{yr=2016; y=1; a[y]=56; print (yr++) \" (\" a[y] \" Loads)\" }'"
2016 (56 Loads)

或者这个:

$ sh -c "awk 'BEGIN{yr=2016; y=1; a[y]=56; print \"\\\"\"(yr++) \" (\" a[y] \" Loads)\\\"\" }'"
"2016 (56 Loads)"

或来自对 system() 的调用:

$ awk 'BEGIN{system("awk \"BEGIN{yr=2016; y=1; a[y]=56; print \\\"\\\\\\\"\\\"(yr++) \\\" (\\\" a[y] \\\" Loads)\\\\\\\"\\\" }\"")}'
"2016 (56 Loads)"

并且使用更少的反斜杠:

$ awk 'BEGIN{system("awk -v dq=\"\\\"\" \"BEGIN{yr=2016; y=1; a[y]=56; printf \\\"%s%d (%d Loads)%s%s\\\", dq, yr++, a[y], dq, ORS }\"")}'
"2016 (56 Loads)"

【讨论】:

  • 否,请参阅更新后的问题。我认为部分问题可能是 awk 的输出需要用双引号括起来,以便 gnuplot 接受每一行作为单个输入,例如 "2016 (56 Loads)"
  • 好的,我更新了答案以在输出周围添加引号。是这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2020-12-27
相关资源
最近更新 更多