如何逐行比较两个文件,但仅限于选定的值

时间:2017-10-27 12:17:05

标签: shell awk while-loop

我想逐行比较两个文件,并检查第一个文件中的左/顶部坐标是否在第二个文件中相同。

我在UNIX Shell中遇到有关此命令的问题:

awk -F"px" '{print $1}'

总结一下,我想比较两个Html文档中的px:

输入:

第一个:

<div class="txt" style="position:absolute; left:76px; top:26px;">

第二个:

<div class="txt" style="position:absolute; left:61px; top:28px;">

过程:

i=1
left=1
top=2
while [ "$linesBodyPdf1" > "$i" ]
do
echo "------Line $i--------"
px1=`echo "left V1=" && echo $bodyPdf1 | awk -F"px" '{print $left}' | awk -F"left:" '{print $2}'`
echo $px1
px2=`echo "top V1=" && echo $bodyPdf1 | awk -F"px" '{print $top}' | cut -c7-9`
echo $px2

px1=`echo "left V2=" && echo $bodyPdf2 | awk -F"px" '{print $left}' | awk -F"left:" '{print $2}'`
echo $px1
px2=`echo "top V2=" && echo $bodyPdf2 | awk -F"px" '{print $top}' | cut -c7-9`
echo $px2

left=$(($left + 2))
top=$(($top + 2))
i=$(($i + 1))
done

输出:

------Line 1--------
left V1= 0px; top:0px;" width="595" height="841" src="page1.png"> <div class="txt" style="position:absolute;
top V1= <i
left V2= 0px; top:0px;" width="595" height="841" src="page1.png"> <div class="txt" style="position:absolute;
top V2= <i

而不是:

------Line 1--------
left V1= 76
top V1= 26
left V2= 61
top V2= 28

我不知道怎么办...... 请帮帮我!

2 个答案:

答案 0 :(得分:2)

假设您有两个left / top坐标的文件,每行一对,left值前top值,可能&#34;噪音&# 34;两者之间的行,那么最简单的解决方案是首先过滤掉值(例如用sed),然后逐行比较(例如用awk):

#!/bin/bash
# Usage: compare.sh FILE1 FILE2

filter() {
    sed -nE 's/.*left\s*:\s*([0-9]+)\s*px.*top\s*:\s*([0-9]+)\s*px.*/\1 \2/gp'
}

awk 'NR==FNR { x[NR]=$0 }
     NR>FNR  { print "Line " FNR ": " x[FNR] (x[FNR]==$0 ? " == ":" != ") $0 }'
     <(filter <"$1") <(filter <"$2")

使用first.htmlsecond.html输入,输出如下:

$ cat first.html 
<div class="txt" style="position:absolute; left:76px; top:26px;">
<span>
<div class="txt" style="position:absolute; left:74px; top:25px;">

$ cat second.html 
<div class="txt" style="position:absolute; left:61px; top:28px;">
<div class="txt" style="position:absolute; left:74 px; top: 25px;">
<div class="txt" style="position:absolute; left:61px; top:28px;">

$ ./compare.sh first.html second.html
Line 1: 76 26 != 61 28
Line 2: 74 25 == 74 25
Line 3:  != 61 28

答案 1 :(得分:0)

呀!我已经解决了我的问题。

我写了这样的话:

'{print $left}'

而不是:

'{print $'"${left}"'}'

我可以通过执行以下操作来增加我的变量:

left=$(($left + 2))

这就写了

'{print $2}'
'{print $4}'
'{print $6}'
'{print $8}'
'{print $10}'
...

这就是我想要的

感谢所有人的帮助。

干杯!!!!!