簡體   English   中英

使用AWK過濾CSV文件

[英]Filtering CSV File using AWK

我正在處理CSV文件

這是我的csv文件

用於過濾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表中如下所示:

在此處輸入圖片說明

但是我正在按照以下方式獲得輸出

Disease
GTF2A1L
LOC441
TBC1D1
BCOR
TP53

在Spread Sheet中打開時,我可以以適當的方式獲得結果,但是當我使用awk時,也將采用第2行之間的結果。 我不知道為什么有人可以幫助我。

問題的根源是-您用逗號分隔了帶有嵌入式逗號的值。

這使生活更加困難。 我建議該方法是使用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"; 
}

當然,我無法確定這是否真的有效,因為您在Google驅動器上鏈接的數據實際上與您提出的問題不匹配。 (注意-perl從零開始數組,所以[3]實際上是第4個字段)

但這應該可以解決問題-Text Text::CSV很好地處理帶引號的逗號字段。

不幸的是,您提供的鏈接(“這是我的文件”)指向兩個文件,這兩個文件(在撰寫本文時)似乎都與您提供的示例相對應。 但是,如果您的文件確實是一個CSV文件,並且使用逗號分隔字段和將其嵌入字段中,那么其他地方給出的使用CSV感知工具的建議非常合理。 (我建議考慮使用可以將CSV轉換為TSV的命令行程序,以便整個* nix工具鏈都可以使用。)

您的示例輸出和附帶的注釋表明,您可能已經可以將其轉換為管道分隔或制表符分隔的文件。 如果是這樣,則可以非常有效地使用awk (如果您有選擇的話,我建議您使用標簽,因為這樣諸如cut類的程序特別易於使用。)

因此,一般的想法是將awk與“ |”一起使用 (或制表符)作為主要分隔符( awk -F"|"awk -F\\\\t ),並使用awk的split函數來解析每個頂級字段的內容。

最后,這就是我通過@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

謝謝你的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM