我正在预先形成CIS的客户摘录,并且我需要一些数据,这些数据以密钥值格式存储在另一个文件中。
例如:
文件1(摘录):
1, 3000, 4000, PVXZT1000, 123-3455
2, 4000, 2500, BT21304, 123-3455
文件2(键,值):
PVXZT1000, 136-8400
BT21304, 136-8400
我需要做的是在文件2中查找值PVXZT1000
并找到与之关联的值。然后,我需要将文件1中的123-3455
值替换为文件2中找到的新值,136-8400
有一个简单的&使用unix shell有效的方法吗?或者也许是AWK?
我可以使用任何常见的unix shell。
答案 0 :(得分:3)
使用awk
$ awk 'NR==FNR{a[$1]=$2;next}($4 in a){$5=a[$4]}1' file2 file1
1, 3000, 4000, PVXZT1000, 136-8400
2, 4000, 2500, BT21304, 136-8400
这将通过匹配文件中的键来更新file1
file2
中的最新值。
说明:
NR
是一个awk
变量,其中包含正在读取的当前行号。每当我们读取新文件FNR
重置为0但FNR
没有重置时,NR
包含当前文件即的上下文中的当前行。
# Looking at file2 first
NR==FNR # This is only true when we look at the first file
{ # The block to execute if the previous condition is TRUE
a[$1]=$2 # Create a look-up array a: field 1 is the key and field 2 the value
next # Grab the next line (skips executing any further blocks)
} # End block
# We are now looking a file1
($4 in a) # Check in field 4 was in file2
$5=a[$4] # If found update field 5 with value in the array using the key
} # End the block
1 # Idiom for printing all the lines
如果您想了解awk
,请阅读 Effective AWK Programming 。
答案 1 :(得分:1)
你可以用awk:
来做awk 'NR==FNR{a[$1]=$2;next}{$5=a[$4]}1' file2 file1