如何解决sh:比较2个文件后无法返回一个结果
作为示例,我将输入不同的输入以保护文件的隐私并避免长文本,这些输入具有以下格式:
INPUT1.cfg:
TC # aa # D317
TC # bb # D314
TC # cc # D315
TC # dd # D316
INPUT2.cfg
BL;nn;3
LY;ww;3
LO;xx;3
TC;vv;3
TC;dd;3
OD;pp;3
TC;aa;3
我想要做的是迭代输入1的行中的名称(第2列),并与输入2的行中的名称(第2列)进行比较;如果它们匹配,我们将在输出文件中获得INPUT2的行,否则将返回未找到表的地方,这是我的尝试代码:
#!/bin/bash
input1="input1.cfg";
input2="input2.cfg"
cat $input1|while read line
do
TableNameIN=`echo $line|cut -d"#" -f2`
cat $input2| while read line
do
TableNameOUT=`echo $line|cut -d";" -f2`
if echo "$TableNameOUT" | grep -q $TableNameIN;
then echo "$line" >> output.txt
else
echo "Table $TableNameIN non trouvé"
fi
done
done
这就是我得到的结果:
Table bb not found
Table bb not found
Table bb not found
Table cc not found
Table cc not found
Table cc not found
我设法写出相等的内容,但是我的代码的问题是它在每行的输出“找不到表”中都有,而我只想在所有行的比较结束时只写一次。 >
这是我想要获得的输出:
Table bb not found
Table cc not found
有人可以帮助我吗,PS:我不想使用awk,因为它只是我的代码的一部分,我已经在使用sh
解决方法
假设:
- 对于文件
input2.cfg
,第二列(表名)是唯一的 -
input2.cfg
的大小并不大,因此冒着用尽所有内存来将intput2.cfg
存储在关联数组中的风险(否则,我们可以存储来自input1.cfg
的表名-假设这是一个较小的文件-在数组中并交换两个文件的处理顺序) - 对数据进行排序没有明确要求(否则我们可能需要添加
sort
或两个) -
bash
解决方案就足够了(基于OP当前代码中包含的#!/bin/bash
shebang)
有许多方法可以对此切片进行n切块处理(awk
是我的偏爱,但OP不想使用awk
)。对于这个特定的答案,我将把awk
步骤拉出到单独的bash
命令中。
注意:尽管我们可以使用一组嵌套循环(如OPs代码中所示),但我选择使用关联数组来存储input2.cfg
,从而无需使用反复扫描input2.cfg
。
#!/usr/bin/bash
input1=input1.cfg
input2=input2.cfg
> output.txt # clear out the target file
# load ${input2} into an associative array
unset lines
typeset -A lines # associative array for storing contents of ${input2}
while read -r line
do
x="${line%;*}" # use parameter expansion
tabname="${x#*;}" # to parse out table name
lines["${tabname}"]="${line}" # add to array
done < "${input2}"
# process ${input1}
while read -r c1 c2 tabname rest_of_line
do
[[ -v lines["${tabname}"] ]] && # if tabname has an entry in our array
echo "${lines[${tabname}]}" >> output.txt && # then dump the associated line (from ${input2}) to output.txt
continue # process next line from ${input1}
echo "Table ${tabname} not found" # otherwise print 'not found' message
done < "${input1}"
# display contents of output.txt
echo "++++++++++++++++ output.txt"
cat output.txt
echo "++++++++++++++++"
这将生成以下内容:
Table bb not found
Table cc not found
++++++++++++++++ output.txt
TC;aa;3
TC;dd;3
++++++++++++++++
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。