在bash(Linux)中,从一个csv到另一个csv(如vlookup)中查找值
我已经尝试了所有我在网上找到的解决我的问题的方法,但是没有很好的结果 基本上我有两个csv文件(管道分隔): file1.csv:在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
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