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

按多列筛选CSV文件,对其进行排序并创建2个新文件,csv,awk,filtering,Csv,Awk,Filtering,我一直在寻找如何做以下几个小时,但找不到它。如果我重复了什么,我道歉。 我有22个csv文件,每个文件有14列和17392行。我正在使用awk使用以下命令过滤原始文件: 首先需要获取列14上的值小于0.05的行 awk -F '\t' '$14 < 0.05 { print $0 }' file1 > file2 awk-F'\t'$14file4 我的最后一步是获取第7列或第8列上的值大于1的行(例如,如果第8列上的值为1,则第7列上的值可能为0) awk-F'\t'$7=1

我一直在寻找如何做以下几个小时,但找不到它。如果我重复了什么,我道歉。 我有22个csv文件,每个文件有14列和17392行。我正在使用awk使用以下命令过滤原始文件:

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

awk -F '\t' '$14 < 0.05  { print $0 }' file1 > file2
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
awk-F'\t'$10<-1{print$0}文件2>file3
awk-F'\t'$10>1{print$0}'文件2>file4
我的最后一步是获取第7列或第8列上的值大于1的行(例如,如果第8列上的值为1,则第7列上的值可能为0)

awk-F'\t'$7=1{print$0}'文件4>file6
我的问题是我创建了几个中间文件。最后我只需要两个文件。文件3和4,其中第7列或第8列的值等于或大于1。我怎样才能发出一个awk命令来立即执行该操作? 谢谢。

您可以试试:

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

awk-F'\t'($14<0.05)&&($10<-1)&($7您的问题不明确,因此有许多可能的答案。但是,您可以在
awk
中组合条件,并且可以在一次过程中写入不同的文件,因此您的意思可能是:

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

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
文件6中的输出为:

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

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

如果这是一个令人困惑的问题,我很抱歉。但是您的建议完全符合我的要求。非常感谢,这将节省大量时间。关于第7列和第8列的值,我只是不想打印值小于o的行ne在两列中都有。因此,只要另一列的值等于或大于1,一列中就可以有较小的值。这是基因表达数据,所以我们希望至少在一个样本中表达的基因高于最小阈值。第7列和第8列是两个样本。您好,谢谢。当我运行您的命令时,它会给我一个文件,其中第7列和第8列的值小于1。我想我的问题非常清楚。@Jonathan给出的建议有效。