如何将多行awk脚本集成到shell脚本中


12

我的问题是

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

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

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

  2. 将文本编码转换为utf8

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

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

我已经试写了以下脚本。我能做到只step 1step 4,但既不step 2也没有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

2
将命令保存到shell变量是一种导致许多麻烦的方法。
enzotib


@Anthon。您如何列出命令的清单?我尝试失败,在下面的第二条评论中我遇到了同样的问题,更糟糕的是...
Yves 2013年

@Yves。空行1. xxx换行符/空行2. ..等。但是最简单的方法是再次单击编辑并查看标记。在右上角,您可能会看到一个橙色的问号,它会在格式上进行说明(取决于您的声誉,您可能没有该问号)您可以随时取消编辑。但是,在注释中,您的格式化功能要少得多(单击[Add Comment]按钮下方的帮助以查看注释中允许的内容)。(在这种情况下,您最好更新原始帖子)。
Anthon

Answers:


15

您可以将传递给您的代码存储/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


谢谢。现在,我已经能够使awk命令起作用:$ extractioncmd $ {sourcefolder} $ {sourcefile} $ {modifier} | $ awk“ $ awkcommand”> $ destinationfilepath但是,尝试使用iconv进行相同的操作不起作用:iconv = / usr / bin / iconv param =“ -f L1 -t UTF-8” $ extractioncmd $ {sourcefolder} $ { sourcefile} $ {modifier} | $ iconv“ $ param” | $ awk“ $ awkcommand”> $ destinationfilepath#不起作用,目标文件为空。顺便说一句,我使用完整路径的原因是,我将其作为推荐的做法在本教程中阅读。
伊夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.