Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Linux从两个文件中匹配数字_Linux - Fatal编程技术网

使用Linux从两个文件中匹配数字

使用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

使用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脚本将在给定的示例数据上生成正确的结果:

# 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
(lone
1
是一个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