作为一个例子,我将放置不同的输入以保持文件的隐私并避免长文本,这些输入的形式如下:
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/bash
shebang(
有很多方法可以将此切片(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
++++++++++++++++