Linux 比较两个列号不同的文件,如果条件满足,则将要求打印到新文件中
我有两个超过10000行的文件: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中的每个
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
,因为当awk读取新文件时,file1
重置为FNR
1
如果检查为真,则创建一个关联数组,该数组由{found[$1]+;next}
索引,即$1
中的第一列文件1
此检查仅对第二个文件在中找到$1
执行。如果列1的值为,文件2
,并在关联数组中找到索引$1
,则它将打印整行(由于它是默认操作,所以不会写入)
$s1
将不会展开,因为它位于单引号内。如果要在awk
脚本中使用shell变量,请使用awk-v s1=“$s1”
将其分配给awk
变量,谢谢@Barmar