나는 일부 파일을 읽고 이 파일의 모든 데이터를 다른 병합된 파일에 복사하는 쉘 스크립트를 작성했습니다.
이 작업은 여러 번 발생하며 이전에 복사한 데이터는 다시 복사되지 않습니다. 이를 위해 마지막으로 복사한 줄을 별도의 파일에 저장하고 두 번째부터 비교합니다.
논리적 흐름:
- 처음에는 단일 파일을 읽고 마지막 행을 제외한 전체 데이터가 병합된 파일에 복사됩니다. 마지막으로 복사한 줄을 임시 파일에 저장합니다.
sed '$d' $file >> $consolidatedCSVFile
tail -2 $file | head -1 > $consolidatedCSVFile$lastLines/$(basename $file)$lastLine
- 두 번째부터 임시 파일의 마지막 줄을 읽고 단일 파일에서 해당 줄을 검색합니다. 찾은 후에는 다음 줄의 모든 줄을 가져와 병합된 파일에 추가합니다.
전체 스크립트:
#!/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)
.