我是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结束文件。由于它们看起来一样,我认为它们是相同的。
感谢大家的帮助和建议!
答案 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