KSH:比较 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

我想做的是在input1的行中迭代名称(列2(,并与input2的行中的名称(列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

我设法写出了相等的东西,但我的代码的问题是它在输出中有"0";表未找到";对于每一行,而我只想在所有行的比较结束时只写一次

这是我想要得到的输出:

Table  bb not found
Table  cc not found

有人能帮我吗,附言:我不想使用awk,因为它只是我代码的一部分,我已经使用了sh

假设:

  • 对于文件input2.cfg,第二列(表名(是唯一的
  • input2.cfg不是很大,因此我们有可能耗尽所有内存来存储关联数组中的intput2.cfg(否则,我们可以将input1.cfg的表名(假设这是一个较小的文件(存储在数组中,并交换两个文件的处理顺序(
  • 对要排序的数据没有明确的要求(否则我们可能需要添加一两个sort(
  • bash解决方案就足够了(基于在OP当前代码中包含#!/bin/bashshebang(

有很多方法可以将此切片(awk是我的首选,但OP不想使用awk(。对于这个特定的答案,我将把awk步骤拉到单独的bash命令中。

注意:虽然我们可以使用一组嵌套循环(如在OP代码中(,但我选择使用关联数组来存储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
++++++++++++++++

最新更新