gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:53 26 4
gpt4 key购买 nike

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

有什么简单的方法吗?

最佳答案

您可以使用 awk as 很快地完成

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 中的索引,那么它会打印整行(因为这是默认操作,所以没有写入)

关于linux - 比较具有不同列号的两个文件,如果条件满足则将要求打印到新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com