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