【问题标题】:Unix shell file search for value pairUnix shell 文件搜索值对
【发布时间】:2013-08-30 04:46:03
【问题描述】:

我正在对我们的 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。

【问题讨论】:

  • 如果在 file2 中找不到密钥,你会如何处理 file1?清除值“123-3455”或保持该值不变?但不管它应该遵循哪个规则,你都可以从两位 awk 专家那里找到答案。

标签: bash shell unix awk


【解决方案1】:

一种使用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 包含当前文件上下文中的当前行 每次我们读取一个新文件时FNR 重置为 0 但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

【讨论】:

  • 感谢您的回复。如果在文件 2 中找不到密钥,如果我想清除文件 1 中的值,是否需要更改任何内容?另外,如果您有时间,您是否可以给我发个 PM 并帮我分解一下?我想更多地了解awk。
  • 解释对所有人都有好处,因此我已将其添加到我的答案中。如果您想清除该值,您将放弃检查 ($4 in a) 即 @user000001 答案的作用,这就是我添加注释以明确差异的原因。
  • 您运行的确切命令是什么?你在什么系统上? awk版本可以通过awk --version | head -n 1获取
  • 在 Solaris 上你想使用 /usr/xpg4/bin/awk
  • 是的,这是完全有效的。
【解决方案2】:

你可以用 awk 做到这一点:

awk 'NR==FNR{a[$1]=$2;next}{$5=a[$4]}1' file2 file1

【讨论】:

  • 注意:这假定 file1 中的每个值都将使用在 file2 中找到的有效值进行更新。
  • @sudo_O 是的,你是对的。您的答案可能更可靠
猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2016-12-07
  • 2011-10-11
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多