Linux 比较两个列号不同的文件,如果条件满足,则将要求打印到新文件中

Linux 比较两个列号不同的文件,如果条件满足,则将要求打印到新文件中,linux,shell,unix,awk,Linux,Shell,Unix,Awk,我有两个超过10000行的文件: File1 has 1 col File2 has 4 col 23 23 88 90 0 34 43 74 58 5 43 54 87 52 3 54 73 52 35 4 . . . . 我想比较文件1和文件2中的每个

我有两个超过10000行的文件:

File1 has 1 col      File2 has 4 col     
23                   23 88 90 0
34                   43 74 58 5
43                   54 87 52 3
54                   73 52 35 4 
.                    .
.                    .
我想比较文件1和文件2中的每个值。如果存在,则在文件2中打印该值以及其他三个值。在本例中,输出为:

 23 88 90 0
 43 74 58 5
 54 87 52 3
 .
 .
我已经写了下面的脚本,但它需要太多的时间来执行

s1=1; s2=$(wc -l < File1.txt)
while [ $s1 -le $s2 ]
do n=$(awk 'NR=="$s1" {print $1}' File1.txt)
   p1=1; p2=$(wc -l < File2.txt)
   while [ $p1 -le $p2 ]
   do awk '{if ($1==$n) printf ("%s %s %s %s\n", $1, $2, $3, $4);}'> ofile.txt
   (( p1++ ))
   done
(( s1++ ))
done
s1=1;s2=$(wc-lofile.txt
((p1++)
完成
((s1++)
完成

有什么简单的方法吗?

您可以使用
awk
作为

awk 'FNR==NR{found[$1]++; next} $1 in found'
测试

>>> cat file1
23
34
43
54

>>> cat file2
23 88 90 0
43 74 58 5
54 87 52 3
73 52 35 4

>>> awk 'FNR==NR{found[$1]++; next} $1 in found' file1 file2
23 88 90 0
43 74 58 5
54 87 52 3
它的作用是什么?

  • FNR==NR
    检查
    FNR
    记录的文件号是否等于
    NR
    记录总数。这仅对第一个文件相同,
    file1
    ,因为当awk读取新文件时,
    FNR
    重置为
    1

    • {found[$1]+;next}
      如果检查为真,则创建一个关联数组,该数组由
      $1
      索引,即
      文件1
      中的第一列
  • 在中找到$1
    此检查仅对第二个文件
    文件2
    执行。如果列1的值为,
    $1
    ,并在关联数组中找到索引
    ,则它将打印整行(由于它是默认操作,所以不会写入)


    • $s1
      将不会展开,因为它位于单引号内。如果要在
      awk
      脚本中使用shell变量,请使用
      awk-v s1=“$s1”
      将其分配给
      awk
      变量,谢谢@Barmar