Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 与列表项关联的查找值_Awk - Fatal编程技术网

Awk 与列表项关联的查找值

Awk 与列表项关联的查找值,awk,Awk,我试图从excel中近似vlookup 我有两个文件 文件#1-list.txt: green purple orange 文件#2-reads.txt: blue 2 green 3 red 5 purple 6 我试图读入list.txt的条目,然后转到reads.txt并取出关联的值 所需的输出将是: green 3 purple 6 orange 0 如果我写: awk -F ' ' 'FNR == NR {keys[$1]; next} {if ($1 in keys) prin

我试图从excel中近似vlookup

我有两个文件

文件#1-list.txt:

green
purple
orange
文件#2-reads.txt:

blue 2
green 3
red 5
purple 6
我试图读入list.txt的条目,然后转到reads.txt并取出关联的值

所需的输出将是:

green 3
purple 6
orange 0
如果我写:

awk -F ' ' 'FNR == NR {keys[$1]; next} {if ($1 in keys) print $1,$2}' list.txt reads.txt
我得到:

green 3
purple 6
blue 0
green 3
red 0
purple 6
但橙色没有,我需要这条线:

orange 0
如果我写

awk -F ' ' 'FNR == NR {keys[$1]; next} {if ($1 in keys) print $1,$2; else print $1,0}' list.txt reads.txt
我得到:

green 3
purple 6
blue 0
green 3
red 0
purple 6
有没有办法解决这个问题

这里是主要的新手,所以感谢您的帮助

第一种解决方案(根据所示样本):请您尝试以下内容,并使用所示样本编写和测试

awk '
FNR==NR{
  arr[$1]=$2
  next
}
($0 in arr){
  print $0,arr[$0]
  next
}
{
  print $0,0
}
' reads.txt list.txt
green 3
purple 6
orange 0
对于所示样本,输出如下

awk '
FNR==NR{
  arr[$1]=$2
  next
}
($0 in arr){
  print $0,arr[$0]
  next
}
{
  print $0,0
}
' reads.txt list.txt
green 3
purple 6
orange 0


第二种解决方案(通用解决方案):如果名为
的输入文件reads.txt
具有相同第一列的多个值,并且您希望打印
list.txt
中存在的所有值,请尝试以下操作

awk '
FNR==NR{
  ++arr[$1]
  val[$1 OFS arr[$1]]=$2
  next
}
($0 in arr){
  for(i=1;i<=arr[$0];i++){
    print $0,val[$0 OFS i]
  }
  next
}
{
  print $0,0
}
' reads.txt list.txt
green 3
green 15
green 120
purple 6
orange 0
现在,在运行这个通用解决方案之后,我们将看到以下内容

awk '
FNR==NR{
  ++arr[$1]
  val[$1 OFS arr[$1]]=$2
  next
}
($0 in arr){
  for(i=1;i<=arr[$0];i++){
    print $0,val[$0 OFS i]
  }
  next
}
{
  print $0,0
}
' reads.txt list.txt
green 3
green 15
green 120
purple 6
orange 0

如果顺序不重要,我会使用左键而不是
awk


$join-a1-e0-o0,2.2顺序不重要,只要始终不变,非常有用,谢谢!这两种方法都很有效-通用解决方案稍后可能会有用-谢谢!