在bash(Linux)中,从一个csv到另一个csv(如vlookup)中查找值

在bash(Linux)中,从一个csv到另一个csv(如vlookup)中查找值,linux,bash,csv,compare,vlookup,Linux,Bash,Csv,Compare,Vlookup,我已经尝试了所有我在网上找到的解决我的问题的方法,但是没有很好的结果 基本上我有两个csv文件(管道分隔): file1.csv: 123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN| 123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN| 123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|S

我已经尝试了所有我在网上找到的解决我的问题的方法,但是没有很好的结果

基本上我有两个csv文件(管道分隔):

file1.csv:

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|

123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|

123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|
MAYOBAN|BANGOR|2400

MAYOBEL|BELLAVARY|2400

CORKKIN|KINSALE|2200

CORKCOR|CORK|2200

DUBLD11|DUBLIN 11|2100
file2.csv:

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|

123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|

123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|
MAYOBAN|BANGOR|2400

MAYOBEL|BELLAVARY|2400

CORKKIN|KINSALE|2200

CORKCOR|CORK|2200

DUBLD11|DUBLIN 11|2100
我需要一个LinuxBash脚本来根据文件1中pos7的内容从文件2中查找pos.3的值

例如:

file1, line1, pos 7: MAYOBAN
find MAYOBAN in file2, return pos 3 (2400)
输出应如下所示:

**2400**

**2200**

**2200**

**etc...**
CORKCOR|2200
CORKKIN|2200
MAYOBAN|2400
请帮忙
Jacek

一个小方法,远离完美:

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)
这是没有用的。为了获得有用的输出,请包含键值:

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

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|

123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|

123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|
MAYOBAN|BANGOR|2400

MAYOBEL|BELLAVARY|2400

CORKKIN|KINSALE|2200

CORKCOR|CORK|2200

DUBLD11|DUBLIN 11|2100
以下是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。

您可以使用Miller()

cut -d\| -f7 file1.csv|while read line
do 
  grep $line file1.csv|cut -d\| -f3
done
从input01.txt开始

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|
123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|
123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|
和input02.txt

MAYOBAN|BANGOR|2400
MAYOBEL|BELLAVARY|2400
CORKKIN|KINSALE|2200
CORKCOR|CORK|2200
DUBLD11|DUBLIN 11|2100
跑步

mlr--csv-N--ifs“|”join-j 7-l 7-r 1-f input01.txt然后cut-f 3 input02.txt
你会有

2400
2200
2200
一些注意事项:

  • -N
    设置无表头的输入和输出
  • --ifs“|”
    设置输入字段分隔符
  • -l7-r1
    设置输入文件的连接字段
  • cut-f3
    从联接输出中提取名为
    3
    的字段

拆分为阵列并检查是否存在重复项。不确定这是怎么做的,但这是我的第一个想法。From:“每个记录都由字段组成,由其他字符或字符串分隔,最常见的是一个文字逗号或制表符。”和“在常用情况下,几乎任何分隔符分隔的文本数据都可以称为“CSV”文件。”@DennisWilliamson:谢谢你的启发。太好了!这很有魅力。实际上,第一个选项很好,因为我不需要排序。输出用于统计目的,因此如果数量合适,就可以了。我试过AWK,但没有很好的效果。@Yasapl:我在答案中添加了一个AWK版本。如果你觉得我的答案有用,请把它标为接受并投票表决。谢谢