ファイルを入力し、ファイルを読み込み、ループで実行するbashスクリプトを実行しています。私の問題は私のawkコマンドです。なぜエラーが発生するのかわかりません。
スクリプトを実行するファイルを入力します。
./almost.sh < text.txt
スクリプトは
#!/bin/bash
while read STRING
do
echo $STRING
"awk -v RS='' -v ORS='\n\n' $STRING file.txt" >> out.txt
#grep $STRING dbutils.list.Volume.txt >> out.txt
done
私が得た結果は次のとおりです。
00061
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 00061 list.txt: command not found
00062
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 00062 list.txt: command not found
00091
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 00091 list.txt: command not found
000C1
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 000C1 list.txt: command not found
000C2
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 000C2 list.txt: command not found
誰でもawkコマンドで私を助けることができますか?コマンドがループ内になく、一度だけ実行されると正常に動作します。
答え1
コマンドがないため、エラーが報告されます。
"awk -v RS='' -v ORS='\n\n' $STRING file.txt"
awkとその引数(意味なし)は二重引用符の間にあり、シェルの組み合わせはコマンドであり、シェルは "awk -v RS = '' -v ORS = '\ n \ n'というファイルを探しています。 STRINGファイル.txt"。
おそらくあなたは
awk -v RS='' -v ORS='\n\n' "/$STRING/" file.txt >> out.txt
答え2
これ以上答えがないので、スクリプト全体を次のように簡単に置き換えることができることを提案します。
grep -F -f text.txt file.txt >out.txt
これは、text.txtへの入力が正規表現ではなくチェックされる文字列であると仮定します。エラーメッセージは、$ STRINGを000.に置き換えることを示唆しています。したがって、-fはファイルから各文字列を読み取り、-Fは文字列を処理します。通常の文字列として。 file.txtに一致するすべてのエントリはout.txtに送信されます。
以下のdave_thompson_085のコメントに応じて、既知の構造を持つ段落がある場合はまだ役に立ちます。つまり、検索する文字列が各段落の特定の行にあり、-B
and-A
オプションを使用して前の行を印刷することもできます。番号もそうで裏面もそうだし。