如何在 shell 脚本中集成多行 awk 脚本

如何在 shell 脚本中集成多行 awk 脚本

我的问题是继续

如何解析文件以提取“组号”中保存的 3 位数字

我正在尝试将一系列命令集成到一个 shell 脚本中

  1. 解析欧洲标准以提取测试序列

  2. 将文本编码转换为utf8

  3. 使用上面帖子中提供给我的 awk 例程处理结果。

  4. 将内容保存在目标文件中

我暂时写了下面的脚本。我只能实现step 1and step 4,但不能实现step 2nor step 3。我想知道是否应该创建中间(临时)文件。我尝试将中间步骤的输出存储到变量中,但没有成功。任何帮助对于可能的错误以及执行此操作的最佳方法也会有帮助。

#!/bin/bash
# creating the Latex code for a test procedure

awkcommand= "/usr/bin/awk
 '
    $1 == "Group" {printf("\\section{%s %d}\n", $1, $2); next}
    {
      title = sep = ""
      for (i=1; i<=NF; i++) 
        if ($i ~ /^[0-9][0-9][0-9]$/) {
          printf("\\subsection{%s} \n\\TestDetails{%d}\n", title, $i)
          break
        }
        else {
          title = title sep $i
          sep = FS
        }
    }
' 
"

sourcefolder="/Users/yves/Desktop/Test-folder-parsing/"
sourcefile="NFEN3545-001.pdf"
destfile="Latex-code.tex"
destfolder=$sourcefolder
destinationfilepath=${destfolder}${destfile}
extractioncmd="/usr/local/bin/pdftotext -layout -f 54 -l 54"
modifier=" -"
#textencodingcmd="/usr/bin/iconv -f L1 -t UTF-8" # Needed but not used

${extractioncmd}  ${sourcefolder}${sourcefile} ${modifier}  >  $destinationfilepath
exit 0

答案1

您可以将传递给的代码存储/usr/bin/awk在一个变量和 /usr/bin/awk一个单独的变量中,如下所示(未经测试):

awk=/usr/bin/awk

awkcommand='
$1 == "Group" {printf("\section{%s %d}\n", $1, $2); next}
{
title = sep = ""
for (i=1; i<=NF; i++) 
  if ($i ~ /^[0-9][0-9][0-9]$/) {
    printf("\subsection{%s} \n\TestDetails{%d}\n", title, $i)
    break
  }
  else {
    title = title sep $i
    sep = FS
  }
}
'

用法:

$awk "$awkcommand"

请注意,我将双引号更改为单引号。双引号内的$i被 shell 变量 的内容替换i。在单引号内,它是一个文字$i,这是awk期望看到的。

另外,您没有转义字符串中的双引号,因此 awk从未见过

$1 == "Group" {printf("\section{%s %d}\n", $1, $2); next}

相反,它看到了

<contents of shell $1> == Group {printf(\section{%s %d}\n, <contents of shell $1>, <contents of shell $2>); next}

如果$1$2为空,awk则看见

 == Group {printf(\section{%s %d}\n, , ); next}

您确定需要存储命令位置吗?您通常可以依赖于awk在用户路径中的目录中查找。如果您不使用 的完整路径awk,则没有理由对 进行参数化awk

相关内容