2016-06-20 12 views
1

固定幅ファイルの2つの連続する行の違いとポイントを見つけるにはどうすればよいですか?2つの連続する行が異なっているかどうかを確認してください。

サンプルファイル:

cat test.txt 
1111111111111111122211111111111111 
1111111111111111132211111111111111 

出力:

、2本のラインとの差の位置との差があることをユーザに知らせるべきであるがでている: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がnullの場合、例えばGNU AWK、OSXのawkなど

+1

私の必要に応じてスクリプトを修正しました(正確な差異を印刷するには)。 –

+1

'(i = 1; i <= NF; i ++)a [i] = $ i'を' split($ 0、a) 'に置き換えることができます。 – karakfa

+0

ありがとう@karakfa、とても良いアイデアです。 – anubhava

2

Perlの救助に:結果はNULLバイトでない場合

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

は、それは、2つの入力文字列とレポートのすべてのポジションを排他的論理和演算、すなわちストリングは異なっていた。

+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 = "" 
関連する問題