複数行のawkスクリプトをシェルスクリプトに統合する方法


12

私の質問は

「グループ番号」に保持されている3桁の数字を抽出するためにファイルを解析する方法

私は単一のシェルスクリプトに一連のコマンドを統合しようとしています

  1. 欧州規格を解析してテストシーケンスを抽出する

  2. テキストエンコーディングをutf8に変換します

  3. 上記の投稿で私に提供されたawkルーチンで結果を処理します。

  4. コンテンツを宛先ファイルに保存する

以下のスクリプトを暫定的に作成しました。私は達成することができるよstep 1step 4、どちらもstep 2step 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
コマンドをシェル変数に保存することは、多くのトラブルにつながるアプローチです。
エンゾチブ

1
彼が言ったこと、スペードで。mywiki.wooledge.org/BashFAQ/050
tripleee

@アンソン。どのようにしてコマンドの素晴らしいリストを作成しましたか?私は失敗しましたが、下の2番目のコメントにも同じ問題がありますが、さらに悪いこと
Yves

@Yves。空行1. xxx改行/空行2. ..など。しかし、最も簡単なのは、もう一度編集をクリックしてマークアップを確認することです。右上には、フォーマットについて説明するオレンジ色の疑問符が表示される場合があります(評判によっては表示されない場合があります)編集はいつでもキャンセルできます。ただし、コメントでは、書式設定機能がはるかに少なくなります([Add Comment]ボタンの下のヘルプをクリックして、コメントで許可されている内容を確認します)。(その場合、元の投稿を更新した方が良いかもしれません)。
アントン

回答:


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は、シェル変数の内容で置き換えられます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#は機能しません。ターゲットファイルは空です。ところで、フルパスを使用した理由は、チュートリアルで推奨されるプラクティスとしてこれを読んだからです。
イヴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.