我有两个超过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
的索引,那么它打印整行(不写入,因为这是默认操作)