Awk 查找所有用零填充的文件

Awk 查找所有用零填充的文件,awk,sed,grep,Awk,Sed,Grep,我有大约30GB的文本文件,有6行标题,然后是可以最好地想象为矩阵的内容,从很小的1x1到数万行和列。内容中的数字只能采用两个值:0和1 我想查找所有内容都用零填充的文件,因此没有一个“1”值。用Python编写脚本应该很简单,但我想学习如何用awk、grep或sed编写脚本 我能想到的一种方法就是使用grep搜索“1”,如果在给定的文件中找不到它,那么我们就有一个匹配项(因为我们只有两个可能的值)-但是我如何从特定的行进行搜索,即跳过页眉?假设我有两个文件: $ cat 1_1.txt Hea

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

我想查找所有内容都用零填充的文件,因此没有一个“1”值。用Python编写脚本应该很简单,但我想学习如何用awk、grep或sed编写脚本


我能想到的一种方法就是使用grep搜索“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
的行数,而且计算所有行和列中
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

perl-nlE'$。我想您可能正在寻找类似这样的东西:

gawk '
  BEGINFILE { no_ones = 1 };
  NR < 7 { next };
  /1/ { no_ones = 0; nextfile };
  ENDFILE { if (no_ones) print FILENAME }
' files...
gawk'
BEGINFILE{no_one=1};
NR<7{next};
/1/{no_one=0;nextfile};
ENDFILE{如果(没有)打印文件名}
“文件。。。
这使用GNU awk(用于BEGINFILE、ENDFILE、nextfile)。

我的目标:

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

上面使用GNU awk作为ENDFILE和nextfile。

tail-n+10
将为您提供文件中的11+行,然后您可以对其进行grep。
sed-n'2,${/1/;p;}'文件
从第2行开始,扫描到文件的结尾
$
,如果找到1,则打印该行。为什么不只是:tail+7“$file”| grep-c1@AlainCollins因为
grep-c 1
只打印包含任何
1
内容的行的计数,例如,包含
1 0 1 1 1
内容的行将仅计数1x。e、 g.您将获得包含1的行数,以及所有行和列中1的总计数
echo'100011'| grep-c1
打印
1
,而
echo'100011'| grep-o1 | grep-c'
打印
3
。我没有看到OP请求中的“一行有多少个1”。虽然很酷。也许这只是我版本的tail(?),但下面的方法行不通:tail+7;选项'-n'是必需的。由于文件的大小,不需要计数,甚至不建议计数。无论如何谢谢你!很好用!我不选择这个答案的唯一原因是另一个答案要快得多;也像预期的那样工作!我没有选择这个的唯一原因是另一个稍微快一点。谢谢
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
awk -F'1' '
FNR>6 && NF>1 { f=1; nextfile }
ENDFILE { print FILENAME, (f ? "got a one" : "all zeros"); f=0 }
' file1 file2 ...