2016-06-20 51 views
1

如何查找固定寬度文件的兩個連續行之間的差異和差異點?如果兩個連續的行是不同的,並且其中

示例文件:

cat test.txt 
1111111111111111122211111111111111 
1111111111111111132211111111111111 

輸出:

它應當通知用戶有兩行和差的位置之間的差異是在:第18字符(如在上面的例子中)

如果它可以列出所有位置的多個變體的情況下將是非常有幫助的。例如:

11111111111111111211113111 
11111111111111111211114111 

這裏應該說:在第18和第26個字符中出現差異。

我正在嘗試以下幾行內容,但似乎丟失了。

while read line 
do 

echo $line |sed 's/./ &/g' |xargs -n1 #NOt able to apply diff (stupid try) 

done <test.txt 

回答

1

您可以使用空場分離,使每個字符領域awk和比較的每一個條目,即使奇數記錄記錄:

awk 'BEGIN{ FS="" } NR%2 { 
    split($0, a) 
    next 
} 
{ 
    print "line # ", NR 
    for (i=1; i<=NF; i++) 
     if ($i != a[i]) 
     print "difference spotted in position:", i 
}' test.txt 

line # 2 
difference spotted in position: 18 
line # 4 
difference spotted in position: 18 
difference spotted in position: 23 

如果輸入的數據是:

cat test.txt 

1111111111111111122211111111111111 
1111111111111111132211111111111111 
11111111111111111211113111 
11111111111111111311114111 

PS:它只會在awk版本上工作,將記錄拆分爲字符時FS爲空,如GNU AWK,OSX AWK等

+1

謝謝,我根據自己的需要修改了你的腳本(要打印確切的區別)。工作得很好! –

+1

您可以使用'split($ 0,a)' – karakfa

+0

替換'for(i = 1; i <= NF; i ++)a [i] = $ i'謝謝@karakfa,非常好的主意。保存一個循環,(編輯) – anubhava

2

Perl來救援:

$ echo '11131111111111111211113111 
11111111111111111211114111' \ 
| perl -le '$d = <>^<>; 
      print pos $d while $d =~ /[^\0]/g' 
4 
23 

它異或兩個輸入字符串並報告所有的位置,其中結果不是空字節,即其​​中字符串是不同的。

+0

簡短而強大,謝謝。我試過它的工作。 –

+0

對於長輸入字符串,它也應該非常快。 – choroba

1
$ cat tst.awk 
{ curr = $0 } 
(NR%2)==0 { 
    currLgth = length(curr) 
    prevLgth = length(prev) 
    maxLgth = (currLgth > prevLgth ? currLgth : prevLgth) 
    print "Comparing:" 
    print prev 
    print curr 
    for (i=1; i<=maxLgth; i++) { 
     prevChar = substr(prev,i,1) 
     currChar = substr(curr,i,1) 
     if (prevChar != currChar) { 
      printf "Difference: char %d line %d = \"%s\", line %d = \"%s\"\n", i, NR-1, prevChar, NR, currChar 
     } 
    } 
    print "" 
} 
{ prev = curr } 

$ cat file 
1111111111111111122211111111111111 
1111111111111111132211111111111111 
11111111111111111111111111 
11111111111111111111111 

$ awk -f tst.awk file 
Comparing: 
1111111111111111122211111111111111 
1111111111111111132211111111111111 
Difference: char 18 line 1 = "2", line 2 = "3" 

Comparing: 
11111111111111111111111111 
11111111111111111111111 
Difference: char 24 line 3 = "1", line 4 = "" 
Difference: char 25 line 3 = "1", line 4 = "" 
Difference: char 26 line 3 = "1", line 4 = "" 
相關問題