我在文本文件中设置了以下数据集
数据.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
通过单awk命令我认为它比使用 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 $1
arr
;创建一个以 为键的关联数组$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 文件不是,这也会起作用已排序。