我有三个文件,我想从其中提取一些列并将它们粘贴到一个新文件中。这些文件不一定有相同的行数。它们在其第一列中对值进行排序。
文件1的结构如下:
col1;col2;col3;col4
SAMPLE-1;1;1;1
SAMPLE-2;1;1;1
SAMPLE-3;1;1;1
SAMPLE-4;1;1;1此文件由";“而不是",”分隔。
文件2的结构如下:
col5,col6,col7,col8
SAMPLE-1_OTHER_INFO,2,2,2
SAMPLE-2_OTHER_INFO,2,2,2
SAMPLE-3_OTHER_INFO,2,2,2文件3的结构如下:
col9,col10,col11,col12
SAMPLE-1_OTHER_INFO,3,3,3
SAMPLE-2_OTHER_INFO,3,3,3
SAMPLE-3_OTHER_INFO,3,3,3输出文件(summary.csv)应该如下所示:
col1,col2,col4,col6,col7,col10,col12
SAMPLE-1,1,1,2,2,3,3
SAMPLE-2,1,1,2,2,3,3
SAMPLE-3,1,1,2,2,3,3
SAMPLE-4,1,1,,,,基本上,所有三个文件的第一列都包含示例标识符。Col1的file1应该是输出文件的第一列。然后,col1中的标识符应该与col5和col9 of file2和file3中的标识符匹配。在进行比较时,不应考虑“_OTHER_INFO”部分。
如果匹配,应该添加文件2和3的col6、col7、col10和col12值的信息。
如果没有匹配,则该行仍应位于输出文件中,但最后四列应为空(如本例中的“Sam-4”)。
我计划使用awk或“剪切/粘贴”命令执行此操作。但是,我不知道如何在col1、col5和col9中的值之间寻找匹配。
发布于 2017-07-17 12:31:00
sort + sed技巧(用于排序输入文件):
join -t, -j1 -a1 -o1.1,1.2,1.4,2.2,2.3 <(tr ';' ',' < file1) <(sed 's/_[^,]*//g' file2)
| join -t, - -a1 -o1.1,1.2,1.3,1.4,1.5,2.2,2.4 <(sed 's/_[^,]*//g' file3)产出:
SAMPLE-1,1,1,2,2,3,3
SAMPLE-2,1,1,2,2,3,3
SAMPLE-3,1,1,2,2,3,3
SAMPLE-4,1,1,,,,https://stackoverflow.com/questions/45141217
复制相似问题