使用Linux从两个文件中匹配数字
使用Linux命令或脚本,我想比较两个文件中的数据。第一个文件有一系列7个数字,后面一行是名称,文件中有几行数字和名称。数字不能在同一行上重复,但可以在另一行中找到,并将按顺序在每一行上列出 文件1示例: 01 02 03 04 05 06 07姓名1 11 12 13 14 15 16 17姓名2 01 03 05 11 12 14 16姓名3 我想知道文件1中的一行数字何时与文件2中的另一组数字匹配。文件2中的数字不重复,将按顺序排序 文件2示例: 01 02 03 04 05 11 12 14 15 16 18 20 只要文件1中的一行数字与文件2中的任何数字匹配,我就希望显示匹配的行,包括名称 输出示例: 01 03 05 11 12 14 16姓名3 如果没有匹配,我想显示“no match”或类似内容 我不熟悉Linux和脚本文件,非常感谢您的帮助。谢谢。这个(相当难看的)bash脚本将在给定的示例数据上生成正确的结果:使用Linux从两个文件中匹配数字,linux,Linux,使用Linux命令或脚本,我想比较两个文件中的数据。第一个文件有一系列7个数字,后面一行是名称,文件中有几行数字和名称。数字不能在同一行上重复,但可以在另一行中找到,并将按顺序在每一行上列出 文件1示例: 01 02 03 04 05 06 07姓名1 11 12 13 14 15 16 17姓名2 01 03 05 11 12 14 16姓名3 我想知道文件1中的一行数字何时与文件2中的另一组数字匹配。文件2中的数字不重复,将按顺序排序 文件2示例: 01 02 03 04 05 11 12
# Read numbers against which to match from File2 into array.
read -a match_array <<< "$(cat File2)"
# Traverse each line in File1
while read -a line
do
if [ "$line" != "" ]
then
# Counter for the number of matches
match=0
# Strip off the name on the end, leaving only numbers to match
for n in "${line[@]:0:7}"
do
for m in "${match_array[@]}"
do
if [ "$n" == "$m" ]
then
# Successfully matched a number, increment counter.
match=$(($match + 1))
fi
done
# Correct number of matches
if [ "$match" == "7" ]
then
echo ${line[@]}
fi
done
fi
done < File1
#将要匹配的数字从文件2读入数组。
读取-匹配数组使用Awk很容易做到这一点。让我们把这个零碎的拿出来
NR==FNR { for (i=1; i<=NF; ++i) a[$i]=1; next }
否则,请打印
1
(lone1
是一个Awk习惯用法,如果我们在脚本中遇到这一部分,它会打印输入。这是一个非常正确的条件,没有任何操作;默认操作是打印输入行。)
将所有内容收集到一个shell脚本片段中,我们得到
awk 'NR==FNR { for (i=1; i<=NF; ++i) a[$i] = 1; next }
{ for (i=1; i<NF; i++) if (! ($i in a)) next } 1' File2 File1
awk'NR==FNR{for(i=1;我要澄清的是,只要所有数字都出现在文件2中某一行的某一点上,您希望文件2中的一行与文件1匹配?如果文件2只有一行?很漂亮!比普通Bash=)太好了!这是使我的程序充分运行的最后一个关键组成部分。我还有很多东西要学,我将把Awk添加到我的列表的顶部。@savanto也感谢你的帮助。我同意,这更有效。我很感激。谢谢你。
awk 'NR==FNR { for (i=1; i<=NF; ++i) a[$i] = 1; next }
{ for (i=1; i<NF; i++) if (! ($i in a)) next } 1' File2 File1