2012-02-26 79 views
0

我對Bash腳本編程非常陌生。我正在嘗試編寫一個適用於兩個文件的腳本。該文件的每一行看起來是這樣的:從文件讀取的Bash腳本具有亂碼輸出

INST <_variablename_> = <_value_>; 

的兩個文件有很多變數,但他們都以不同的順序,所以我不能只是diff的他們。我想要做的是通過文件並找到所有具有不同值的變量,或者找到一個文件中指定的變量,而不是另一個文件中指定的所有變量。

這是我的腳本到目前爲止。再說一遍,我對Bash很陌生,所以請對我輕鬆一下,但也可以隨時提出改進建議(我很感激它)。

#!/bin/bash 
line_no=1 
while read LINE 
do 
    search_var=`echo $LINE | awk '{print $2}'` 
    result_line=`grep -w $search_var file2` 
    if [ $? -eq 1 ] 
    then 
    echo "$line_no: not found [ $search_var ]" 
    else 
    value=`echo $LINE | awk '{print $4}'` 
    result_value=`echo $result_line | awk '{print $4}'` 
    if [ "$value" != "$result_value" ] 
    then 
     echo "$line_no: mismatch [ $search_var , $value , $result_value ]" 
    fi 
    fi 
    line_no=`expr $line_no + 1` 
done < file1 

現在,這裏的是我得到的一些輸出的例子:

111: mismatch [ TXAREFBIASSEL , TRUE; , "TRUE"; ] 
, 4'b1100; ] [ TXTERMTRIM , 4'b1100; 
113: not found [ VREFBIASMODE ] 
, 2'b00; ]ch [ CYCLE_LIMIT_SEL , 2'b00; 
, 3'b100; ]h [ FDET_LCK_CAL , 3'b101; 

第一行是什麼,我會期待(我會稍後再處理引號)。在第二行,第四行和第五行,看起來最終的值是覆蓋「line_no:mismatch」部分。此外,在第二行和第四行,值相匹配 - 它不應該打印任何東西!

我問了我的朋友這件事,他的建議是「用Perl做的」。所以我現在正在學習Perl,但我仍然想知道發生了什麼以及爲什麼會發生這種情況。

謝謝!

編輯:

嘆息。我解決了這個問題。其中一個文件有Unix換行符,另一個有DOS換行符。我其實認爲這可能是這種情況,但我也認爲如果vi打開一個dos結尾的文件,vi應該顯示一些字符。由於他們看起來一樣,我認爲他們是一樣的。

感謝您的幫助和建議!

+1

閱讀'comm'工具。祝你好運。 – shellter 2012-02-26 21:48:26

回答

4

與其簡單地用Perl代替Bash語言,不如說是一種範式轉變?

diff -w <(sort file1) <(sort file2) 

這兩個文件進行排序,這樣的變量將出現在每一個相同的順序,並且將會給出結果(忽略空格的差異,只是爲了好玩)。

這可能會給你更多或更少你需要的東西,本身沒有任何「代碼」。請注意,如果您發現更容易,您也可以將文件分類到中間文件,然後運行diff ......我碰巧喜歡在沒有臨時文件的情況下執行此操作。

+0

簡單而優雅,我喜歡。但是,我可以擴展它來處理TRUE與「TRUE」情況嗎?我想我可以編輯這些文件......無論如何,謝謝你,我可以這麼做。但是,爲什麼我的腳本會這樣做?我仍然想知道。 – 2012-02-26 22:00:47

2

這是怎麼回事? 2在這兩個文件中都是可用的並且具有相同的值。其他值可以輕鬆解析。

sort 1.txt 2.txt | uniq -c 
     2 a = 10 
     1 b = 20 
     1 b = 40 
     1 c = 10 
     1 c = 30 
     1 e = 50 

或類似這樣得到您的密鑰和值。

sed 's|INST \(.*\) = \(.*\)|\1 = \2|' 1.txt 2.txt | sort | uniq -c 
     2 a = 10 
     1 b = 20 
     1 b = 40 
     1 c = 10 
     1 c = 30 
     1 e = 50 
+0

有趣,但我不認爲它的工作。我得到了這樣的結果:1 TXPRE_PRDRV_DAC = 3'b111; 1 TXPRE_PRDRV_DAC = 3'b111; 1 TXPRE_TAP_DAC = 5'b00000; 1 TXPRE_TAP_DAC = 5'b00000;不應該因爲他們匹配而結合起來? – 2012-02-27 00:11:10

+0

放置你的輸出並運行'uniq'。 '貓dnm.txt | uniq -c 2 TXPRE_PRDRV_DAC = 3'b111; 2 TXPRE_TAP_DAC = 5'b00000;' – 2012-02-27 00:19:05

+0

但是我們已經管道到uniq?爲什麼我們需要再做一次? – 2012-02-27 00:37:55