【发布时间】:2022-08-19 07:01:28
【问题描述】:
我在一个文件夹中有 15 个文本文件(每个大约 1.5 - 2 GB),每个文件有大约 300,000 到 500,000 行和大约 250 列,每个都有一个带有列名的标题行。我还有一个包含五个值的列表(\"a123\"、\"b234\"、\"c345\"、\"d456\" 和 \"e567\")。 (这些是任意值,值不按顺序排列,彼此之间没有任何关系)
对于五个值中的每一个,我想在 15 个文本文件中的每一个中进行查询,如果 \"COL_ABC\" 或 \"COL_DEF\" 等于该值,则选择行。 (\"COL_ABC\" 和 \"COL_DEF\" 是任意名称,列名之间没有任何关系。)我不知道哪个列号是 \"COL_ABC\" 或 \"COL_DEF\"。它们在每个文件之间有所不同,因为每个文件都有不同的列数,但是在每个文件中 \"COL_ABC\"/\"COL_DEF\" 将被命名为 \"COL_ABC\"/\"COL_DEF\"。此外,一些文件同时具有 \"COL_ABC\" 和 \"COL_DEF\",但其他文件只有 \"COL_ABC\"。如果只有 \"COL_ABC\" 存在,我想对 \"COL_ABC\" 进行查询,但如果两者都存在,我想对两列进行查询(即检查 \"a123\" 是否存在于其他列中\"COL_ABC\" 或 \"COL_DEF\",如果为真则选择该行)。
我对 awk 很陌生,所以如果这是一个简单的问题,请原谅我。我只能进行简单的过滤,例如:
awk -F \"\\t\" \'{ if(($1 == \"1\") && ($2 == \"2\")) { print } }\' file1.txt
对于十五个文件中的每一个,我想将结果打印到一个新文件中。
通常我可以在 R 中执行此操作,但我的文件太大而无法读入 R。谢谢!
-
这真的没有你想的那么糟糕。每个文件将按顺序处理,并且由于每个文件都包含一个标题行,只需使用
\'FNR == 1 { ...; next }作为规则中的条件即可读取每个文件中的第一条记录。循环遍历每个字段for (i=1; i<=NF; i++) { col[$i] = i }以按字段编号列 NAME 索引col数组。作为价值。然后对于其余的记录,您可以循环for (i=1; i<=NF; i++) if (\"name_you_want\" in col) { # do what you want with $i value }。如果需要保留列顺序,可以交换col[i] = $i。 -
GNU Awk User\'s Guide 是你的朋友。
标签: awk