在bash(Linux)中查找另一个csv的值(如vlookup)

我已经尝试了所有我在网上find的选项来解决我的问题,但没有好的结果。

基本上我有两个CSV文件(pipe道分离):

file1.csv

123 | 21 | 0452 | IE | IE | 1 | MAYOBAN | BRIN |办公室|街道|主要街道| MAYOBAN |

123 | 21 | 0453 | IE | IE | 1 | CORKKIN | ROBERT | SURNAME | |软木APTS | CORKKIN |

123 | 21 | 0452 | IE | IE | 1 | CORKCOR | NAME | HARRINGTON |都柏林| STREET | CORKCOR |

file2.csv:

MAYOBAN | BANGOR | 2400

MAYOBEL | BELLAVARY | 2400

CORKKIN | KINSALE | 2200

CORKCOR |软木| 2200

DUBLD11 |都柏林11 | 2100

我需要一个linux bash脚本来根据file1中pos7的内容从file2中findpos.3的值。

例如:file1,line1,pos 7:MAYOBAN在file2中查找MAYOBAN,返回pos 3(2400)

输出应该是这样的:

2400

2200

2200

等等…

请帮助Jacek

Solutions Collecting From Web of "在bash(Linux)中查找另一个csv的值(如vlookup)"

一点点的做法,远远要完美:

DELIMITER="|" for i in $(cut -f 7 -d "${DELIMITER}" file1.csv ); do grep "${i}" file2.csv | cut -f 3 -d "${DELIMITER}"; done 

这将工作,但由于输入文件必须排序,输出顺序将受到影响:

 join -t '|' -1 7 -2 1 -o 2.3 <(sort -t '|' -k7,7 file1.csv) <(sort -t '|' -k1,1 file2.csv) 

输出将如下所示:

 2200 2200 2400 

这是没用的。 为了有一个有用的输出,包括关键值:

 join -t '|' -1 7 -2 1 -o 0,2.3 <(sort -t '|' -k7,7 file1.csv) <(sort -t '|' -k1,1 file2.csv) 

输出结果如下所示:

 CORKCOR|2200 CORKKIN|2200 MAYOBAN|2400 

编辑:

这是一个AWK版本:

 awk -F '|' 'FNR == NR {keys[$7]; next} {if ($1 in keys) print $3}' file1.csv file2.csv 

这通过file1.csv循环,并为字段7的每个值创建数组条目。只需引用数组元素创建它(具有空值)。 FNR是当前文件中的记录编号, NR是所有文件中的记录编号。 当它们相等时,第一个文件正在被处理。 next条指令读取下一条记录,创建一个循环。 当FNR == NR不再为真时,后续文件被处理。

所以现在file2.csv被处理,如果它有一个存在于数组中的字段1,那么它的字段3被打印出来。

 cut -d\| -f7 file1.csv|while read line do grep $line file1.csv|cut -d\| -f3 done