我一直在寻找如何在几个小时内完成以下操作但无法找到它。如果我重复一些事情,我道歉。 我有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命令立即执行此操作? 谢谢。
答案 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
此命令应该在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
如果您需要以不同方式组合条件,那么您需要澄清您的问题。
答案 1 :(得分:0)
你可以尝试:
awk -F'\t' '($14 < 0.05) && ($10 < -1) && ($7 <= 1) {print}' file1 > file3