几个小时以来,我一直在搜索如何执行以下操作,但找不到。如果我重复某些内容,我深表歉意。 我有 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/