我编写了一个 shell 脚本,它读取一些文件并将这些文件中的所有数据复制到其他合并文件中。
这种情况会发生多次,之前复制的数据将不会再次复制。为此,我将最后复制的行保存在一个单独的文件中,并从第二次开始进行比较。
逻辑流程:
- 第一次,读取单个文件并将除最后一行之外的整个数据复制到合并文件中。将最后复制的行保存到临时文件中。
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)
。