![通过匹配列、连接命令连接两个 csv 文件](https://linux22.com/image/135880/%E9%80%9A%E8%BF%87%E5%8C%B9%E9%85%8D%E5%88%97%E3%80%81%E8%BF%9E%E6%8E%A5%E5%91%BD%E4%BB%A4%E8%BF%9E%E6%8E%A5%E4%B8%A4%E4%B8%AA%20csv%20%E6%96%87%E4%BB%B6.png)
我有两个 .csv 文件,需要根据第 1 列进行匹配。
两个文件结构如下所示。
文件1
gopAga1_00004004-RA,1122.825534, -2.497919969, 0.411529843
gopAga1_00010932-RA,440.485381, 1.769511316, 0.312853434
gopAga1_00007012-RA, 13.37565185, -1.973108929, 0.380227982
etc...
文件2
gopAga1_00004004-RA, ENSACAP00000013845
gopAga1_00009937-RA, ENSACAP00000000905
gopAga1_00010932-RA, ENSACAP00000003279
gopAga1_00000875-RA, ENSACAP00000000296
gopAga1_00010837-RA, ENSACAP00000011919
gopAga1_00007012-RA, ENSACAP00000012682
gopAga1_00017831-RA, ENSACAP00000016147
gopAga1_00005588-RA, ENSACAP00000011117
etc..
这是我当前使用 join 运行的命令:
这是我在以下线程中阅读的内容的格式这里
join -1 1 -2 1 -t , -a 1 -e "NA" -o "2.2,1.1,1.2,1.3" <(sort -k 1 healthy_vs_unhealthy_de.csv) <(sort RBH.csv) > output.txt
但是,每次我运行此提示时,它只会将第一行写入输出。
有人知道为什么我的代码会这样运行,并且实际上没有根据 GOP ID 合并两个文件吗?
答案1
我们应该将分隔符指定为逗号sort
# join -1 1 -2 1 -t , -a 1 -e "NA" -o "2.2,1.1,1.2,1.3" <(sort -t',' -k 1 healthy_vs_unhealthy_de.csv) <(sort -t',' RBH.csv)
ENSACAP00000013845,gopAga1_00004004-RA,1122.825534, -2.497919969
ENSACAP00000012682,gopAga1_00007012-RA, 13.37565185, -1.973108929
ENSACAP00000003279,gopAga1_00010932-RA,440.485381, 1.769511316
答案2
作为湿婆正确指出,您的主要问题是该sort
实用程序被错误调用。但是,您还存在嵌入空格的问题,这可能会给排序带来问题。
切换到使用csvkit 工具为了在命令行上解析和处理 CSV 文件,我们可以使用它csvjoin
来执行连接。这是假设输入数据中没有空行。如果有空行,则首先删除这些空行,可能是通过grep -vx '[[:blank:]]*'
.
csvjoin --no-header-row --skipinitialspace --columns=1 file1 file2
或者,使用简短的选项,
csvjoin -HS -c 1 file1 file2
鉴于您问题中的数据,这将输出
a,b,c,d,b2
gopAga1_00004004-RA,1122.825534,-2.497919969,0.411529843,ENSACAP00000013845
gopAga1_00010932-RA,440.485381,1.769511316,0.312853434,ENSACAP00000003279
gopAga1_00007012-RA,13.37565185,-1.973108929,0.380227982,ENSACAP00000012682
请注意,它添加了您稍后可能想要删除的标头(可能使用tail -n +2
)。
要重新排列它(并删除第三列),我们可以使用csvcut
.我们还删除了tail
刚刚提到的添加的标头:
csvjoin -HS -c 1 file1 file2 |
csvcut -c 5,1-3 |
tail -n +2
...这将导致
ENSACAP00000013845,gopAga1_00004004-RA,1122.825534,-2.497919969
ENSACAP00000003279,gopAga1_00010932-RA,440.485381,1.769511316
ENSACAP00000012682,gopAga1_00007012-RA,13.37565185,-1.973108929
所使用的列csvcut
也可以使用临时标题来指定,例如 as-c b2,a,b,c
或类似 的组合-c b2,1-3
。