shell 脚本映射字段并从列表中返回相应的值

shell 脚本映射字段并从列表中返回相应的值
Symbol  Test  
XXX,1  
GHL,2  
MKT,13  
LOC,15  
LMT,76  
TIF,45  

Shell 脚本应该为每个测试返回相应的符号。

如果$Test=1,那么$symbol应该XXX

我怎样才能做到这一点?

答案1

您可以使用bash关联数组:

declare -A foobar
while read -r foo bar; do foobar["$bar"]="$foo"; done < <(tail -n +2 file.txt)

这将生成一个关联数组,该数组foobar通过从包含键值映射的文件中读取从第二行开始的行来命名。

现在您可以声明一个小函数,如:

choose () { echo "${foobar["$1"]}" ;}

它将输出作为第一个参数给出的指定键上存储的值。

例子 :

$ choose 2
GHL
$ choose 1
XXX

答案2

这只需要一点点awk

awk -v var=1 '$2 == var {print $1}' your_file

也就是说,查找第二个字段等于给定变量的行var;当发生这种情况时,打印第一个字段。

答案3

Python 也可以完成这个工作:

python -c 'import sys;print [i.split(",")[0] for x,i in enumerate(sys.stdin) if x > 0 and i.strip().split(",")[1] == sys.argv[1]]' 13  < input.txt

或者作为实际脚本:

#!/usr/bin/env python
import sys
for x,i in enumerate(sys.stdin): 
    if x > 0 and i.strip().split(",")[1] == sys.argv[1]:
         print i.strip().split(",")[0]

测试运行:

$ python find_line.py 76 < input.txt                                                                                         
LMT

其工作原理很简单:我们重定向input.txt到脚本stdin,然后逐行读取,跳过第一行并使用逗号将行拆分为列表。要查找的数字作为第一个命令行参数给出。

如果没有标题行,那就简单多了——这样可以消除enumerate()调用,并简化行检查if i.strip().split(",")[1] == sys.argv[1]

相关内容