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

时间:2014-03-14 23:19:39

标签: 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,那么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命令立即执行此操作? 谢谢。

2 个答案:

答案 0 :(得分:2)

你的问题很模糊,所以有很多可能的答案。但是,您可以在awk中组合条件,并且可以在一次通过中写入单独的文件,因此您可能意味着:

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

此命令应该在file5file6中为您提供与原始操作序列相同的输出(但它只对数据进行一次传递,而不是很多)。 (严格来说,如果您将$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

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

答案 1 :(得分:0)

你可以尝试:

awk -F'\t' '($14 < 0.05) && ($10 < -1) && ($7 <= 1) {print}' file1 > file3