使用AWK过滤CSV文件

时间:2015-12-22 10:48:39

标签: linux csv awk filtering

我正在处理CSV文件

This my csv file

用于过滤awk -F"," '{print $14}' out_file.csv > test1.csv

的命令

这是我的数据示例,我有大约43行和12,000列 我计划用awk命令分离单行,但我不能单独分开第3行(疾病)。

我使用以下命令获取输出

awk -F"," '{print $3}' out_file.csv > test1.csv

这是我的档案:

gender|gene_name  |disease         |1000g_oct2014|Polyphen |SNAP 
male  |RB1,GTF2A1L|cancer,diabetes |0.1          |0.46     |0.1  
male  |NONE,LOC441|diabetes        |0.003        |0.52     |0.6  
male  |TBC1D1     |diabetes        |0.940        |1        |0.9  
male  |BCOR       |cancer          |0            |0.31     |0.2  
male  |TP53       |diabetes        |0            |0.54     |0.4  

注意“|”我没有用这个分隔符。它用于显示订单中的行,我的详细信息在spreed表中看起来与此完全相同:

enter image description here

但我按照以下方式获得输出

Disease
GTF2A1L
LOC441
TBC1D1
BCOR
TP53

在Spread Sheet中打开时,我可以以正确的方式获得结果,但是当我使用awk时,也会在第2行之间进行。我不知道为什么 任何人都可以帮助我。

3 个答案:

答案 0 :(得分:1)

问题的根源是 - 您使用逗号分隔值并使用嵌入式逗号。

这使生活变得更加困难。我建议这种方法是使用csv解析器。

我非常喜欢perlText::CSV

#!/usr/bin/env perl
use strict;
use warnings;

use Text::CSV;

open ( my $data, '<', 'data_file.csv' ) or die $!; 

my $csv = Text::CSV -> new ( { binary => 1, sep_char => ',', eol => "\n" } );

while ( my $row = $csv -> getline ( $data ) ) {
   print $row -> [2],"\n"; 
}

当然,我无法确定这是否真的有效,因为您在谷歌硬盘上链接的数据实际上与您提出的问题不符。 (注意 - perl在零处开始数组,因此[3]实际上是第4个字段)

但它应该做的伎俩 - Text::CSV很好地处理引用的逗号字段。

答案 1 :(得分:0)

不幸的是,您提供的链接(“这是我的文件”)指向两个文件,这两个文件(在撰写本文时)似乎都与您提供的示例相对应。但是,如果您的文件确实是一个CSV文件,其逗号分别用于分隔字段和嵌入字段,那么其他地方使用CSV感知工具的建议非常合理。 (我建议考虑一个可以将CSV转换为TSV的命令行程序,以便整个* nix工具链可供您使用。)

您的示例输出和附带注释表明您可能已经有办法将其转换为竖线分隔或制表符分隔的文件。如果是这样,那么awk可以非常有效地使用。 (如果您有选择,那么我建议使用标签,因为cut之类的程序特别容易使用。)

然后,一般的想法是将awk与“|”一起使用(或制表符)作为主分隔符(awk -F"|"awk -F\\t),并使用awk的split函数来解析每个顶级字段的内容。

答案 2 :(得分:0)

最后,这就是我用简单的方式得到答案的感谢,感谢@peak我找到了解决方案

我第一次使用了 CSV过滤器,它是用于过滤csv文件的python模块。 我使用csvfilter使用以下命令更改了分隔符

csvfilter input_file.csv --out-delimiter="|" > out_file.csv

此命令用于将分隔符','更改为'|' 现在我使用awk命令来排序和过滤

awk -F"|" 'FNR == 1 {print} {if ($14 < 0.01) print }' out_file.csv > filtered_file.csv

感谢您的帮助。