我有大约30 GB的文本文件,有6行标题,然后内容可以最好地想象成一个矩阵,从微小的1x1到成千上万的行和列。内容中的数字只能使用两个值:0和1。
我想找到所有内容都填充零的文件,所以没有一个' 1'值。在Python中编写脚本应该是直截了当的,但我想学习如何在例如awk,grep或sed。
我能想到的一种方法就是使用grep来搜索' 1'如果在给定文件中找不到,那么我们有匹配(因为我们只有两个可能的值) - 但是如何从特定行搜索,即跳过标题?
答案 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)。