查找所有用零填充的文件

时间:2014-09-05 21:11:31

标签: awk sed grep

我有大约30 GB的文本文件,有6行标题,然后内容可以最好地想象成一个矩阵,从微小的1x1到成千上万的行和列。内容中的数字只能使用两个值:0和1。

我想找到所有内容都填充零的文件,所以没有一个' 1'值。在Python中编写脚本应该是直截了当的,但我想学习如何在例如awk,grep或sed。

我能想到的一种方法就是使用grep来搜索' 1'如果在给定文件中找不到,那么我们有匹配(因为我们只有两个可能的值) - 但是如何从特定行搜索,即跳过标题?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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和nextfile。

答案 3 :(得分:0)

下一个脚本将计算给定文件中1的总数,例如不仅包含一些1的行数,而且包含所有行和所有列中1的实数:

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

你也可以用perl计算1

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

e.g

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

答案 4 :(得分: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,nextfile)。