我有大約30GB的文本文件,其中包含6行標題,然後是可以最佳想象爲矩陣的內容,從小1x1到成千上萬行和列。內容中的數字可能只有兩個值:0和1.查找所有填滿零的文件
我想查找所有內容都用零填充的文件,因此不是一個'1'值。用Python編寫腳本應該很簡單,但我想在例如Python中學習如何編寫腳本。 awk,grep或sed。
我能想到的一種方法就是使用grep來搜索'1',如果它在給定文件中找不到,那麼我們有一個匹配(因爲我們只有兩個可能的值) - 但我怎麼能從特定的行搜索,即跳過標題?
我有大約30GB的文本文件,其中包含6行標題,然後是可以最佳想象爲矩陣的內容,從小1x1到成千上萬行和列。內容中的數字可能只有兩個值:0和1.查找所有填滿零的文件
我想查找所有內容都用零填充的文件,因此不是一個'1'值。用Python編寫腳本應該很簡單,但我想在例如Python中學習如何編寫腳本。 awk,grep或sed。
我能想到的一種方法就是使用grep來搜索'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和下一文件。
工程很好,是最快的 - 謝謝! – 2014-09-06 11:50:22
假設我有兩個文件:
$ 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
運作良好!唯一的原因是我不選擇這個答案只是另一個更快。 – 2014-09-06 11:48:37
下一個腳本將計算給定文件中的總數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
可以算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)
爲什麼不只是:tail +7「$ file」| grep -c 1 – 2014-09-05 22:43:21
@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
我沒有在OP的請求中看到「連續有多少個1」。很酷,但。 – 2014-09-05 23:00:48
我想你可能會尋找這樣的事情:
gawk '
BEGINFILE { no_ones = 1 };
NR < 7 { next };
/1/ { no_ones = 0; nextfile };
ENDFILE { if (no_ones) print FILENAME }
' files...
它使用GNU AWK(用於BEGINFILE,ENDFILE,下一文件)。
我的看法:以上
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
非常好,清晰的答案;也按預期工作!唯一的原因是我沒有選擇這個,只是另一個稍微快一點。謝謝! – 2014-09-06 11:51:49
'tail -n + 10'會爲您提供來自文件的第11行,然後您可以grep。 – 2014-09-05 21:16:19
'sed -n'2,$ {/ 1 /; p;}'file'從第二行開始掃描到文件結尾'$',如果找到1,則打印該行。 – shellter 2014-09-05 21:39:29