我有两个具有这些值的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
答案 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 line
或for
循环),并使用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