2014-09-05 71 views
1

我有大約30GB的文本文件,其中包含6行標題,然後是可以最佳想象爲矩陣的內容,從小1x1到成千上萬行和列。內容中的數字可能只有兩個值:0和1.查找所有填滿零的文件

我想查找所有內容都用零填充的文件,因此不是一個'1'值。用Python編寫腳本應該很簡單,但我想在例如Python中學習如何編寫腳本。 awk,grep或sed。

我能想到的一種方法就是使用grep來搜索'1',如果它在給定文件中找不到,那麼我們有一個匹配(因爲我們只有兩個可能的值) - 但我怎麼能從特定的行搜索,即跳過標題?

+2

'tail -n + 10'會爲您提供來自文件的第11行,然後您可以grep。 – 2014-09-05 21:16:19

+1

'sed -n'2,$ {/ 1 /; p;}'file'從第二行開始掃描到文件結尾'$',如果找到1,則打印該行。 – shellter 2014-09-05 21:39:29

回答

1
awk -F'1' ' 
FNR>6 && NF>1 { f=1; nextfile } 
ENDFILE { print FILENAME, (f ? "got a one" : "all zeros"); f=0 } 
' file1 file2 ... 

使用GNU AWK的ENDFILE和下一文件。

+1

工程很好,是最快的 - 謝謝! – 2014-09-06 11:50:22

1

假設我有兩個文件:

$ cat 1_1.txt 
Header 1 
Header 2 
Header 3 
0 0 0 0 0 
0 0 0 1 0 
0 0 0 0 0 
$ cat zereos.txt 
Header 1 
Header 2 
Header 3 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

您可以使用SED跳過頭和打印的N行,然後用1任何行他們:

$ sed -n '1,3d; /1/p' zereos.txt 
$ sed -n '1,3d; /1/p' 1_1.txt 
0 0 0 1 0 

所以現在將其組合成一個Bash腳本:

for file in * 
    do rtr=$(sed -n '1,3d; /1/p' "$file") 
    if [[ $rtr =~ ^$ ]]; then echo "$file" 
    fi 
done 

打印

zereos.txt 
+0

運作良好!唯一的原因是我不選擇這個答案只是另一個更快。 – 2014-09-06 11:48:37

0

下一個腳本將計算給定文件中的總數1,例如,不僅什麼包含一些11中的所有線路的實數,所有列的行數:

file="somefile.txt" 
tail +7 "$file" | grep -o 1 | grep -c '.' 
^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^ 
     |    |   +--- count the number of lines 
     |    +---- filter out all "1" - each on alone line 
     +-------- prints the file from the 7th line 

,你可以使用它像

file="somefile" 
ones=$(tail +6 "$file" | grep -o 1 | grep -c '.') 
case "$ones" in 
    0) do_something "$file" ;;  #no 1 in the file 
    *) do_other "$file" "$ones" ;; #here is $ones number of "1" 
esac 

可以算1用Perl也

perl -nlE '$.<7&&next;$c+=()=m/1/g}{say $c' < filename 

ones=$(perl -nlE '$.<7&&next;$c+=()=m/1/g}{say $c' < filename) 
+0

爲什麼不只是:tail +7「$ file」| grep -c 1 – 2014-09-05 22:43:21

+0

@AlainCollins,因爲'grep -c 1'僅打印包含任何「1」的行數,例如內容爲「1 0 1 1 1」的行將只計入1次。例如你將得到所有行和所有列中包含1和nie的總數爲1的行數......'echo'1 0 0 1 1'| grep -c 1'打印'1',而'echo'1 0 0 1 1'| grep -o 1 | grep -c'''打印'3'。 – jm666 2014-09-05 22:57:04

+0

我沒有在OP的請求中看到「連續有多少個1」。很酷,但。 – 2014-09-05 23:00:48

0

我想你可能會尋找這樣的事情:

gawk ' 
    BEGINFILE { no_ones = 1 }; 
    NR < 7 { next }; 
    /1/ { no_ones = 0; nextfile }; 
    ENDFILE { if (no_ones) print FILENAME } 
' files... 

它使用GNU AWK(用於BEGINFILE,ENDFILE,下一文件)。

1

我的看法:以上

for file in *; do 
    if sed 1,6d "$file" | grep -q 1; then 
     echo "$file has a one" 
    else 
     echo "$file has no ones" 
    fi 
done 

隨着GNU sed的,你可以寫

for file in *; do 
    if sed -n '1,6d; /1/ q 1' "$file"; then 
     echo "$file has no ones" 
    else 
     echo "$file has a one" 
    fi 
done 
+0

非常好,清晰的答案;也按預期工作!唯一的原因是我沒有選擇這個,只是另一個稍微快一點。謝謝! – 2014-09-06 11:51:49

相關問題