通过匹配列、连接命令连接两个 csv 文件

通过匹配列、连接命令连接两个 csv 文件

我有两个 .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

相关内容