【问题标题】:match rows from one file to columns in another file将一个文件中的行匹配到另一个文件中的列
【发布时间】:2021-03-15 23:16:07
【问题描述】:

我有两个文件,其中一个文件在每一行中包含如下名称:-

GTX-1175F-223-RGXC
GTX-1135F-223-RGXC
GTX-1145F-223-RGXC
GTX-1155F-223-RGXC
GTX-1185F-223-RGXC

第二个文件包含 file1 中每个名称的值,如下所示:

GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC GTX-1175F-240-RGXC
2.3 12 5.6 4
3.4 4.5 0.8 6
3.8 89 0.2 4

预期输出

GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC
2.3 12 5.6 
3.4 4.5 0.8
3.8 89 0.2 

我想要一个输出,其中 file2 中与文件 1 中的行名匹配的列名与值一起被提取。

如果是列匹配,应该是这样的

awk 'FNR==NR{ a[$1]=$0;next } ($1 in a)' file2 file1

谁能帮我在 awk 中写一个单行。

谢谢

【问题讨论】:

  • 我理解那部分,我失败了,这就是为什么寻求帮助或指导。
  • 请发布您尝试的代码,我们一定可以提供帮助
  • 如果是列,可能是这样的 awk 'FNR==NR{ a[$1]=$0;next } ($1 in a)' file2 file1
  • edit your question 并将此尝试的代码放在问题正文中。评论不是检查代码的正确位置。
  • 如果你能展示你的预期输出,那将是很好的。

标签: awk


【解决方案1】:

你可以试试这个 2 pass awk 解决方案:

awk 'FNR==NR {
   seen[$1]
   next
}
{
   s = ""
   for (i=1; i<=NF; ++i) {
      if (FNR==1 && $i in seen)
         cols[i]
      if (i in cols)
         s = (s=="" ? "" : s OFS) $i
   }
   print s
}' file1 file2

GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC
2.3 12 5.6
3.4 4.5 0.8
3.8 89 0.2

【讨论】:

  • 由于某种奇怪的原因,我得到空白作为您和 Glenn 代码的输出。相同的输入文件。
  • 你能不能用cat -vte file1检查它的输出,看看你是否没有^M(DOS行结尾)。
【解决方案2】:

类似于@anubhava 的回答:

awk '
  NR == FNR {seen[$1]; next}
  FNR == 1 {for (i = 1; i <= NF; i++) keep[i] = ($i in seen)}
  {
    for (i = 1; i <= NF; i++) if (keep[i]) printf "%s%s", $i, OFS
    print "" 
  }
' file{1,2}
GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC
2.3 12 5.6
3.4 4.5 0.8
3.8 89 0.2

【讨论】:

  • 我之前写的正是这个,但增强了它,因为它在每一行留下了尾随空格。
猜你喜欢
  • 2013-08-29
  • 2019-11-19
  • 1970-01-01
  • 2015-08-07
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
相关资源
最近更新 更多