Unix shell文件搜索值对

时间:2013-08-27 12:26:27

标签: bash shell unix awk

我正在预先形成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。

2 个答案:

答案 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