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



我有两个超过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 
.                    .
.                    .

我想比较file-1和file-2中的每个值。如果存在,则将该值与file-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 %sn", $1, $2, $3, $4);}'> ofile.txt
   (( p1++ ))
   done
(( s1++ ))
done
有什么简短/简单的方法来做这件事吗?

您可以使用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为索引的关联数组,file1的第一列
  • $1 in found此检查仅对第二个文件file2执行。如果列1的值,$1是关联数组found的索引,那么它打印整行(不写入,因为这是默认操作)

最新更新