csv - 按多列过滤 CSV 文件,对它们进行排序并创建 2 个新文件

标签 csv awk filtering

几个小时以来,我一直在搜索如何执行以下操作,但找不到。如果我重复某些内容,我深表歉意。 我有 22 个 csv 文件,每个文件有 14 列和 17,392 行。我正在使用 awk 使用以下命令过滤原始文件:

首先需要获取第14列值小于0.05的行

awk -F '\t' '$14 < 0.05  { print $0 }' file1 > file2

接下来,我需要获取值大于 1 且小于 -1 的行。

awk -F '\t' '$10 < -1 { print $0 }' file2 > file3
awk -F '\t' '$10 > 1 { print $0 }' file2 > file4

我的最后一步是获取第 7 列或第 8 列的值高于 1 的行(例如,如果第 8 列为 1,则第 7 列可能为 0)

awk -F '\t' '$7<=1 {print $0}' file3 > file5
awk -F '\t' '$8>=1 {print $0}' file4 > file6

我的问题是我创建了几个中间文件。最后我只需要两个文件。 File3 和 4,其中第 7 列或第 8 列的值等于或大于 1。我怎样才能使 awk 命令立即执行此操作? 谢谢。

最佳答案

您的问题不明确,因此有多种可能的答案。但是,您可以在 awk 中组合条件并且您可以一次写入多个单独的文件,因此您的意思可能是:

awk -F '\t' '$14 < 0.05 && $10 < -1 && $7 > 1 { print > "file5" }
             $14 < 0.05 && $10 > +1 && $8 > 1 { print > "file6" }' file1

此命令应在 file5 中为您提供相同的输出和 file6正如您从原始操作序列中获得的那样(但它只传递一次数据,而不是很多)。 (严格来说,如果您将 $7<=1 更改为 $7>1 以同意您对想要 column 7 or 8 higher than 1 的描述,它会产生相同的答案,尽管这与您的示例相矛盾 '在 7 上可能是 0 如果在 8 上它是 1 '.)

给定一个输入文件:

1    2    3    4    5    6    7    8    9    -10  11   12   13   -14
1    2    3    4    5    6    7    8    9    10   11   12   13   -14
1    2    3    4    5    6    7    8    9    10   11   12   13   14

file5 中的输出是:

1    2    3    4    5    6    7    8    9    -10  11   12   13   -14

file6 中的输出是:

1    2    3    4    5    6    7    8    9    10   11   12   13   -14

如果您需要以不同方式组合条件,那么您需要澄清您的问题。

关于csv - 按多列过滤 CSV 文件,对它们进行排序并创建 2 个新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417490/

相关文章:

linux - 在 do 循环中将参数传递给 awk

awk - 使用 awk 查找大于或等于 0.021 到 0 的值

awk - 是否有 INT_MIN 和 INT_MAX 等价的 awk?

javascript - Array.filter 返回空数组

python - python读取utf-8 csv中文文件的方法

xml - Perl XML::Twig。巨大的文件处理。如何处理重复条目和不存在的条目

Ruby CSV 解析带有转义引号的字符串

c# - 有什么方法可以读取/写入对象到.csv

php - 将 base64 编码的用户数据放入 img 的 src 中是否安全?

python - numpy 的 CSV 过滤