如何在Shell中匹配列并提取两个文件之间的值

时间:2020-10-06 17:45:46

标签: linux string bash shell

我有两个具有这些值的csv文件

FileA.csv

CACHE_1005,VB14314690
CACHE_1071,VB69700608
CACHE_1211,VB85967916

FileB.csv

CACHE_1005,unk,HS2000-785_105^1
CACHE_1005,unk,HS2000-785_105^2
CACHE_1005,unk,HS2000-899_107^2
CACHE_1005,unk,HS2000-901_127^1
CACHE_1071,unk,HS2000-152_566^1
CACHE_1071,unk,HS2000-940_103^7
CACHE_1071,unk,HS2000-940_103^8
CACHE_1211,unk,HS2000-152_566^2
CACHE_1211,unk,HS2000-152_566^3
CACHE_1211,unk,HS2000-152_566^4

我想匹配两个csv文件中的第一列,并提取FileA中第二列的值并追加到FileB。这是我想要的结果:

Result.csv

CACHE_1005,unk,HS2000-785_105^1,VB14314690
CACHE_1005,unk,HS2000-785_105^2,VB14314690
CACHE_1005,unk,HS2000-899_107^2,VB14314690
CACHE_1005,unk,HS2000-901_127^1,VB14314690
CACHE_1071,unk,HS2000-152_566^1,VB69700608
CACHE_1071,unk,HS2000-940_103^7,VB69700608
CACHE_1071,unk,HS2000-940_103^8,VB69700608
CACHE_1211,unk,HS2000-152_566^2,VB85967916
CACHE_1211,unk,HS2000-152_566^3,VB85967916
CACHE_1211,unk,HS2000-152_566^4,VB85967916

2 个答案:

答案 0 :(得分:7)

这正是join命令的作用。

> join -t, fileB.csv fileA.csv 
CACHE_1005,unk,HS2000-785_105^1,VB14314690
CACHE_1005,unk,HS2000-785_105^2,VB14314690
CACHE_1005,unk,HS2000-899_107^2,VB14314690
CACHE_1005,unk,HS2000-901_127^1,VB14314690
CACHE_1071,unk,HS2000-152_566^1,VB69700608
CACHE_1071,unk,HS2000-940_103^7,VB69700608
CACHE_1071,unk,HS2000-940_103^8,VB69700608
CACHE_1211,unk,HS2000-152_566^2,VB85967916
CACHE_1211,unk,HS2000-152_566^3,VB85967916
CACHE_1211,unk,HS2000-152_566^4,VB85967916

-t设置分隔符,还必须像示例中那样对文件进行排序,如果没有,则可以join <(sort file2) <(sort file1),而不保留顺序,或者尝试使用--nocheck-order。 / p>

注意:假设您有一个简单的csv文件(例如您的示例中),在带引号的字段内没有嵌套的分隔符。

答案 1 :(得分:0)

您可以逐行读取fileA(通过while read linefor循环),并使用sed命令将第2列附加到fileB:

#!/bin/bash
for lineA in $(cat FileA.csv); do
        pattern=${lineA%,*}
        extract=${lineA#*,}
        sed -i "/$pattern/s/$/\,$extract/g" FileB.csv
done