通过 awk 使用 CSV 数据

通过 awk 使用 CSV 数据

我正在尝试找到一种方法从 CSV 文件中获取单个数据,并将其用作 grep 或 awk 命令中的变量。两者似乎都合适,但我不确定如何告诉它适当地执行此操作。

例如,我有一个 TSV 格式的数据集,如下所示:

ID    Name    Eye Color 

1     Bill    Blue 
2     Sam     Blue 
3     Fred    Brown 
4     Joe     Brown 
5     Ted     Blue 
6     Bob     Brown

这不是实际的数据集,但行为方式相同。这是整个蛋白质结合数据库,TSV 为 300MB,包含数百万个条目和数十列,因此我无法清楚地包含真实的内容。

我想创建一个包含蓝眼个体行的文件,因此我创建了一个由“ID”列组成的 CSV 文件,在本例中,该文件如下所示:

1, 2, 5

此包含“ID”的 CSV 是使用“Grep”命令搜索关键字生成的。

我最终想要一个如下所示的 TSV 文件:1 Bill Blue 2 Sam Blue 5 Ted Blue

但我似乎不知道该怎么做。我可以使用 awk 或 grep 为每个条目单独创建它,并包含 ID 号作为条件,但是我使用的 CSV 有 1200 个条目,因此我想自动化此过程。

下面的代码将为单个条目生成所需的结果,但我想使用 ID 号自动搜索。

BindindDB_All.tsv 是我的源文件,有几百万个条目。这将生成一个名为“new.tsv”的 TSV,并包含 BindindDB_All.tsv 文件的整行,其中 ID(第 1 列)等于 66106。

awk '$1 == 66106' BindingDB_All.tsv >> new.tsv

我想做这样的事情:

awk '$1 == ID.csv' BindingDB_All.tsv >> new.csv

它将读取每个 ID,将行打印到 new.csv,然后读取下一个 ID 并执行相同的操作。

该 CSV 文件包含 1200 个搜索词,可与数百万种可能的搜索词进行比较,每个搜索词都有一个唯一的 ID。我需要它只搜索第 1 列,因为它将在每行的其他变量中找到 ID。

总而言之,我需要它查看该行的第 1 列,将其与 CSV 文件中的第一个数字进行比较,并查看它是否匹配。如果不匹配,则需要检查第 1 列中的下一行,依此类推,直到找到匹配项。当它确实找到第 1 列与 CSV 第一个数据点匹配的行时,我希望它输出该行。然后我希望它对 CSV 中的第二个条目重复,直到找到所有 1200 行。

有任何想法吗?这听起来像是一个循环问题,但我也不知道如何使其工作。

编辑:

由于人们似乎仍然愿意提供帮助,让我尝试回答已发布的问题。

以下是我的真实数据的前 6 个条目,其中包含将用作搜索参数的 ID 号。

66106     
66107    
66108    
66109     
66110    
50127715    

没有列名,没有其他数据。这些是我想要在不同文件(TSV)中单独搜索的值。关于 TSV 大小,我也说错了,我有一个 4 GB TSV,压缩后为 300 MB。该文件包含的条目比我的任何程序允许它查看的条目还要多。下面是数百万个条目中的单个条目的示例。我需要立即提取所有这些数据,因此修剪它不是一个选择。

50127715 CCCC(CCC)c1nc2N3[C@H]4CCC[C@H]4N=C3N(C)C(=O)c2[nH]1 InChI=1S/C18H27N5O/c1-4-7-11(8-5 -2)15-20-14-16(21-15)23-13-10-6-9-12(13)19-18(23)22(3)17(14)24/h11-13H,4 -10H2,1-3H3,(H,20,21)/t12-,13+/m1/s1 CSRSQFSFDXYRFV-OLZOCXBDSA-N 50073697 5-甲基-2-(1-丙基丁基)-(6aR,9aS)-3, 4,5,8-四氢环戊[4,5]咪唑并[2,1-b]嘌呤-4-一::CHEMBL280307 磷酸二酯酶 1 Bos taurus 60 ChEMBL 10.1016/s0960-894x(98)00681-7 9990447 Ho, GD Silverman , L Bercovici, A Puchalski, C Tulshian, D Xia, Y Czarniecki, M Green, M Cleven, R 张, H Fawzi, 先灵葆雅研究所 http://www.bindingdb.org/bind/chemsearch/marvin/MolStructure.jsp?monomerid=50073697 http://www.bindingdb.org/jsp/dbsearch/PrimarySearch_ki.jsp?energyterm=kJ/mole&tag=pol&polymerid=49000914&target=磷酸二酯酶+1&column=ki&startPg=0&Increment=50&submit=Search http://www.bindingdb.org/jsp/dbsearch/PrimarySearch_ki.jsp?energyterm=kJ/mole&tag=r21&monomerid=50073697&enzyme=磷酸二酯酶+1&column=ki&startPg=0&Increment=50&submit=Search 44272162 103967010 CHEMBL280307 ZINC28221715 1 MGSTATETEELENTTFKYLIGEQTEKMWQRLKGILRCLVKQLEKGDVNVIDLKKNIEYAASVLEAVYIDETRRLLDTDDELSDIQSDSVPSEVRDWLASTFTRKMGMMKKKSEEKPRRFRSIVHVVQAGIFVERMYRKSYHMVGLAY PEAVIVTLKDVDKWSFDVFALNEASGEHSLKFMIYELFTRYDLINRFKIPVSCLIAFAEALEVGYSKYKNPYHNLIHAADVTQTVHYIMLHTGIMHWLTELEILAMVFAAAIHDYEHTGTTNNFHIQTRSDVAILYNDRSVLENHHVSAAYRLMQEEEMNVLINLSKDDWRDLRNLVIEMVLSTDMSGHFQQIKNIRNSLQQPEGLDKAKTMSLILHAAD ISHPAKSWKLHHRWTMALMEEFFLQGDKEAELGLPFSPLCDRKSTMVAQSQIGFIDFIVEPTFSLLTDSTEKIIIPLIEEDSKTKTPSYGASRRSNMKGTTNDGTYSPDYSLASVDLKSFKNSLVDIIQQNKERWKELAAQGEPDPHKNSDLVNAEEKHAETHS 钙/钙调蛋白依赖性 3',5'-环核苷酸磷酸二酯酶 1A P14100 Q08E30,Q28063

我不知道如何在这个框中将其读取为 TSV,但 50127715 是第一列,即 ID 列。我想让我的初始 CSV 文件(包含感兴趣的 ID 号)在第一列中一次搜索一个 ID 号的大 TSV。如果该数字包含在第一列中,我希望它将该行写入文件,然后搜索下一个 ID。我希望所有结果都在一个文件中。

我确信在我到达这里的所有步骤中都有一种更简单的方法可以做到这一点,但我显然不确定如何使这一点更清楚。我希望它在第 1 列中的大型 TSV 中搜索“66106”,并在找到该行时将整行写入文件中。然后搜索“66107”,找到后将其添加到同一文件中。这样我就有了一个文件,可以是 CSV 或 TSV,包含 1200 个条目而不是数百万个条目。

答案1

$ awk -F'\t' '(NR==1) || ($3=="Blue")' file
ID      Name    Eye Color
1       Bill    Blue
2       Sam     Blue
5       Ted     Blue

不过,听起来您真正想做的是为每个 ID 创建一个新文件,假设 ID 与您的示例一样是唯一的,则为:

awk -F'\t' '{ out="out_" $1 ".txt"; print > out; close(out) }' BindingDB_All.tsv

或者如果您希望每个输出文件包含标头:

awk -F'\t' '
    NR==1 { hdr=$0; next }
    { out="out_" $1 ".txt"; print hdr ORS $0 > out; close(out) }
' BindingDB_All.tsv

答案2

对于将来可能发现此问题的任何人,我有一个解决方案。我做的第一件事是使用以下命令将 TSV 转换为 CSV:

sed 's/\t/,/g' filename_with_tabs > filename_with_commas.csv

然后搜索我正在寻找的文件代码是:

awk -F, 'FNR==NR {h[$1] = $0; next} {print $0,h[$1]}' file1 file2 > new_file.csv

这将在第一列中搜索单独 CSV 中包含的文本。在本例中,“file1”是要搜索的文件,“file2”包含要搜索的字符串。这两个文件都是 CSV 格式。

这会生成一个单独的 CSV 文件,其中包含 file1 中的所有行,这些行在第 1 列中具有与 file2 中包含的 ID 之一相匹配的特定 ID。

我希望有一天这能帮助别人,因为这已经让我的大脑崩溃了好几个星期。我什至自己都没有找到解决方案,我的老板必须向我展示它。

相关内容