grep を使用してテキストを抽出するスクリプト

grep を使用してテキストを抽出するスクリプト

ディレクトリ内の複数のデータ ファイルから 2 つのテキスト文字列を抽出しようとしています。テキスト文字列を ~ 文字で区切り、出力を 1 つのファイルに送信したいと考えています。

ディレクトリ名の例: /xmldocs AND ファイル名はファイルの名前: 1.xml、、2.xml3.xml

期待される出力:

TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 1.xml
TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 2.xml
TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 3.xml

使用されるスクリプトは、grepコマンド1つだけで動作します

for i in `ls`
do
grep "Document ID:" $i
echo "~" 
echo "\n"
done >> /xmldocs/1.txt

2 番目の grep コマンドを挿入すると、grep 'CI[^"]' スクリプトがハングし、出力がありません。

現在の出力は

<KMS_data id="KMS_documentId" name="Document ID:">12</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">19</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">6</KMS_data>
~


grep "Document ID:" $i
~


grep "Document ID:" $i
~


grep "Document ID:" $i > /xmldocs/1.txt
~

どのようなご助力でもありがたいです。私は LINUX/UNIX コマンドについてはまったくの初心者で、20,000 個の XML ファイルから情報を抽出する必要があります。よろしくお願いします。

答え1

アイデアは、grep からの結果を処理し、それを出力ファイルに明示的に追加することです。この方法では、コンソールを使用してデバッグ メッセージを書き込むことができます。

#/bin/bash

# Save output to this file
outputFile='./xmldocs/1.txt'
rm -f $outputFile

# List only *.xml files and iterate
for i in `ls *.xml`
do
    # Echo which file is being processed (only printed to console )
    echo 'Processing :'$i
    # Grep, remove trailing newline and append to $outputFile
    grep "Document ID:" -s $i | tr -d '\n'  >> $outputFile
    # Add char to separate
    printf "~" >> $outputFile
    # Grep, remove trailing newline and append to $outputFile
    grep 'CI[^"]' -s $i | tr -d '\n' >> $outputFile
    # Print newline to separate results
    printf "\n" >> $outputFile
done 

echo '!! done'

これが機能しない場合は、テストするために grep する他の行を投稿してください。

答え2

あなたが望むものは次のとおりですpaste:

#!/bin/bash
for f in *.xml
do
    paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt

答え3

の使用によってスクリプトがハングアップする理由についてはgrep 'CI[^"]'、^ をエスケープする必要があります。 を使用するgrep 'CI[\^"]'と、問題が解決しました。これは、括弧の範囲内であっても、キャロット シンボルが否定として解釈されるためです。

編集: Steeldriver の訂正

関連情報