从文件读取的Bash脚本输出乱码

时间:2012-02-26 21:35:16

标签: bash

我是Bash脚本的新手。我正在尝试编写一个可以处理两个文件的脚本。文件的每一行都是这样的:

INST <_variablename_> = <_value_>;  

这两个文件共享许多变量,但它们的顺序不同,所以我不能只是区分它们。我想要做的是浏览文件并查找具有不同值的所有变量,或者在一个文件中指定但在另一个文件中指定的所有变量。

到目前为止,这是我的脚本。再说一次,我对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”部分。此外,在第二行和第四行,值DO匹配 - 它不应该打印任何东西!

我向我的朋友询问了这个问题,他的建议是“在Perl中做到这一点”。所以我现在正在学习Perl,但我仍然想知道发生了什么以及为什么会发生这种情况。

谢谢!

编辑:

叹息。我解决了这个问题。其中一个文件有Unix换行符,另一个有DOS换行符。我实际上认为这可能是这种情况,但我也认为vi应该显示一些字符,如果它打开一个dos结束文件。由于它们看起来一样,我认为它们是相同的。

感谢大家的帮助和建议!

2 个答案:

答案 0 :(得分:4)

而不是简单地用Perl替换Bash语言,范式转换怎么样?

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

这将对两个文件进行排序,以便变量在每个文件中以相同的顺序出现,并且会对结果产生差异(忽略空白差异,只是为了好玩)。

这可能会给你更多或更少的需求,而不需要任何“代码”。请注意,您还可以将文件排序到中间文件中,如果您觉得更容易,可以在这些文件上运行diff ...我碰巧喜欢这样做而没有临时文件。

答案 1 :(得分: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