2012-02-26 152 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