私はいくつかのファイルを読み込み、このファイルのすべてのデータを他のマージされたファイルにコピーするシェルスクリプトを作成しました。
これは複数回発生し、以前にコピーしたデータは再コピーされません。これを行うには、最後にコピーした行を別のファイルに保存し、2番目から比較します。
論理フロー:
- 最初は単一のファイルを読み取り、最後の行を除くデータ全体をマージされたファイルにコピーします。最後にコピーした行を一時ファイルに保存します。
sed '$d' $file >> $consolidatedCSVFile
tail -2 $file | head -1 > $consolidatedCSVFile$lastLines/$(basename $file)$lastLine
- 2番目から、一時ファイルの最後の行を読み取り、単一のファイルからその行を検索します。見つけたら、次の行のすべての行をインポートしてマージされたファイルに追加します。
フルスクリプト:
#!/bin/bash
consolidatedCSVFile=$1
endTime=$2
curdate=$(date +%s)
CSVFiles=${@:3}
CSVFiles=${CSVFiles[@]}
lastLines=_LASTLINES
lastLine=_LASTLINE
newMerge=false
# Returns 1 if Consolidated file is empty
[ -s $consolidatedCSVFile ]
if [ $? == 1 ]
then
mkdir $consolidatedCSVFile$lastLines
newMerge=true
fi
testInProcess=false
if [ $endTime -ge $curdate ]
then
testInProcess=true
fi
for file in $CSVFiles
do
if $newMerge ;
then
touch $consolidatedCSVFile$1astLines5(basename $file)$lastLine
sed $d $file >> $consolidatedCSVFile
tail -2 $file | head -1 > $consolidatedCSVFile$1astLines5(basename $file)$lastLine
else
availableLastLine="`cat $consolidatedCSVFile$1astLines/$(basename $file)$lastLine`"
if $testInProcess
then
sed '1,/^'"$availableLastLine"'$/d' $file | sed '$d' >> $consolidatedCSVFile
tail -2 $file | head -1 > $consolidatedCSVFile$1astLines5(basename $file)$lastLine
else
sed '1,/^'"$availableLastLine"'$/d' $file >> $consolidatedCSVFile
fi
fi
done
if ! $testInProcess ;
then
rm -rf $consolidatedCSVFile$lastLines
fi
時にはエラーメッセージが表示されます。sed: -e expression #1, char 26: unknown command: 'X'
私の考えでは
JMeterで生成されたファイルをマージしようとしています。時々、これらのファイルは次のデータを生成します。1439459065780,5,SOAP/XML-RPC Request,200,OK,ws test 1-3,text,true,267,3,3,5
私の考えの問題sed '1,/^'"$availableLastLine"'$/d' $file | sed '$d' >> $consolidatedCSVFile
はSOAP/XML
。スラッシュ(/)はここで問題を引き起こす可能性があります。
答え1
availableLastLine
後で動作するように修正されましたavailableLastLine=$(sed 's/\//\\\//' $consolidatedCSVFile$lastLines/$(basename $file)$lastLine)
。