bash 比较两个不同长度的文件中多个列

bash 比较两个不同长度的文件中多个列

我在文本文件中设置了以下数据集

数据.txt

d1,40,gold
d2,30,silver
d3,20,bronze
d4,10,iron
d5,5,wood
d6,20,gold
d7,10,wood
d8,5,gold
d9,10,silver
 .
 .
 .

定义文件

gold,40
silver,30
bronze,20
iron,10
wood,5

我需要将数据与我的定义文件进行比较,并在主文件中添加“ok”或“nok”状态。由于数据文件很大,我可以使用 while 循环来弄清楚,但这需要很长时间。有没有优化的方法?

数据.txt

d1,40,gold,ok
d2,30,silver,ok
d3,20,bronze,ok
d4,10,iron,ok
d5,5,wood,ok
d6,20,gold,nok
d7,10,wood,nok
d8,5,gold,nok
d9,10,silver,nok

答案1

通过单命令我认为它比使用 while 循环更快。你可以测试它的速度time命令前面的命令,看看它是否快;)

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next } 
    { print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, def.txt data.txt
d1,40,gold,ok
d2,30,silver,ok
d3,20,bronze,ok
d4,10,iron,ok
d5,5,wood,ok
d6,20,gold,nok
d7,10,wood,nok
d8,5,gold,nok
d9,10,silver,nok

解释:

  • NR当读取第一条记录时设置为 1awk并且对单个或多个输入文件中的下一个记录进行递增读取,直到所有记录都读取完成。

  • FNR当读取第一条记录时设置为 1awk并且对当前文件中的每个下一个记录读取增加,并且如果有多个输入文件,则将下一个输入文件重置回 1。

  • NR == FNR仅对第一个文件而言如此定义文件

  • arr[$2]=$2 $1arr;创建一个以 为键的关联数组$2,并将第二个和第一个字段复制作为其值。

  • 令牌next跳过执行其余的命令,这些命令实际上只会针对除第一个之外的下一个文件执行。

  • print $0将打印整行数据.txt(arr[$2]==$2 $3?"ok":"nok")(称为三元运算符(condition?"if-true":"if-false")检查中的键值是否与中的(第二和第三个字段)arr[$2]的值相等$2 $3数据.txt然后打印“好的”别的“nok”

  • 如果您的 data.txt 文件和 def.txt 文件不是,这也会起作用已排序

相关内容