[英]Filtering CSV File using AWK
我正在處理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解析器。
我非常喜歡perl
和Text::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.