2017-02-24 55 views
2

我有超過100個列和行1000+(myfile.csv)csv文件,我需要打印頭和每行與小區值小於0.2在至少一個柱(無論哪一列的)到一個新文件(newfile_0.2.csv)。我確實需要整行。如何與比任何列的0.2小的單元格的值顯示的行?

我只能找到這樣做了specific column的方式。

這是我的嘗試失敗的列表(我是很新的編碼):

awk '(NR==1) || ($0 < 0.2) ' myfile.csv > newfile_0.2.csv 

awk -F "," 'BEGIN $0 < 0.2 {print $0}' myfile.csv > newfile_0.2.csv 

awk -F "," '{OFS = ","} BEGIN {$0 < 0.2} {print $0}' myfile.csv > newfile_0.2.csv 

awk '{FS = ","} {OFS = ","} BEGIN {$0 < 0.2} {print $0}' myfile.csv > newfile_0.2.csv 

awk -F "," '{if ($0 < 0.2) print $0}' myfile.csv > newfile_0.2.csv 

while read line; do awk -F "," '{if ($0 < 0.2) print $0}' line ; done <myfile.csv> newfile_0.2.csv 

while read line; do echo $line | awk -F "," '{for (i=1;i<=NF;i++) if ($i < 0.2) print $i}'; done <myfile.csv> newfile_0.2.csv 

會有人知道如何做到這一點?謝謝!

+0

整個行可能與'$ 0'訪問。 – Scheff

回答

0

根據你的努力我這樣做素描:

# file: script.awk 
BEGIN { FS = OFS = "," } 
{ # for every row 
    hit = 0 ; for (i = 1; i <= NF && !hit; ++i) { if ($i < 0.2) hit = 1 } 
    if (hit) print $0 
    next 
} 

樣品會議(Cygwin的,慶典,呆子):

$ cat >myfile.csv <<EOF 
> 1,1,1,1 
> 1,0.1,1,1 
> 2,2,2,2 
> 0,1,2,3 
> 3,3,3,3.0 
> EOF 

$ awk -f script.awk myfile.csv 
1,0.1,1,1 
0,1,2,3 

也許,你必須確保兼容的語言環境。 因此

$ LANG=C 

可能是一個好主意,以防萬一。

玩這個周圍,我得到這個(甚至更短)版本:

# file: script.awk 
BEGIN { FS = OFS = "," } 
{ # for every row 
    for (i = 1; i <= NF; ++i) { if ($i < 0.2) { print $0 ; break } } 
} 

它通過我的測試文件中。

...終於還是減少 「的一行」:

$ awk -F , -v OFS=, '{ for (i = 1; i <= NF; ++i) { if ($i < 0.2) { print $0 ; break } } }' test-filter-0.2.txt 
1,0.1,1,1 
0,1,2,3 
+0

@pdalcinmartins我不知道閹了'next'確有必要。不過,我敢肯定它不會傷害...... – Scheff

+1

您可能需要設定了'OFS =「」'太 – Inian

+0

@pdalcinmartins因此,'next'不需要即行不匹配任何規則都簡單地消耗。 (其實我記得是'lex' /'flex'的行爲,它只是反映了任何不匹配的模式'yyout'。) – Scheff

相關問題