我有2个表格文件.一个文件包含50个键值的映射,仅称为lookup_file.txt.
另一个文件具有30列和数百万行的实际表格数据. data.txt中
我想用lookup_file.txt中的值替换第二个文件的id列.
我怎样才能做到这一点?我更喜欢在bash脚本中使用awk ..
另外,是否有一个hashmap数据结构,我可以在bash中使用它来存储50个键/值而不是另一个文件?
解决方法:
假设您的文件有逗号分隔的字段,“id列”是字段3:
awk '
BEGIN{ FS=OFS="," }
NR==FNR { map[$1] = $2; next }
{ $3 = map[$3]; print }
' lookup_file.txt data.txt
如果这些假设中的任何一个是错误的,请告诉我们如果修复不明显……
编辑:如果你想避免(恕我直言可以忽略不计)NR == FNR测试性能影响,这将是使用getline时适用的每种罕见情况之一:
awk '
BEGIN{
FS=OFS=","
while ( (getline line < "lookup_file.txt") > 0 ) {
split(line,f)
map[f[1]] = f[2]
}
}
{ $3 = map[$3]; print }
' data.txt
标签:bash,linux,awk,perl,unix
来源: https://codeday.me/bug/20190729/1570197.html