我使用的是awk脚本来分割大文本文档为独立的文件。我做到了,现在我有14K的文本文件的工作。这里的问题是,有很多的文件只有三个文本行,它不是很有用,我让他们。
我知道我可以在awk 'NF>=3' file
文本删除线,但我不希望删除线内的文件,而我想删除的文件,其内容只有两个或三个文本行。
提前致谢。
可否请您尝试以下find
command。(与GNU awk
测试)
find /your/path/ -type f -exec awk -v lines=3 'NR>lines{f=1; exit} END{if (!f) print FILENAME}' {} \;
所以,上面会打印谁正在对控制台较小比3行的文件名。一旦你满意的结果来再试试以下命令来删除它们。只有当你确定上面命令的输出运行以下命令,甚至我会建议如下命令在一个测试目录首先运行,一旦你完全满意然后继续下面一(从下我都还是把它安全方面删除echo
: ))
find /your/path/ -type f -exec awk -v lines=3 'NR>lines{f=1; exit} END{exit !f}' {} \; -exec echo rm -f {} \;
如果在当前目录下的文件都是文本文件,这应该是高效的和便携式:
for f in *; do
[ $(head -4 "$f" | wc -l) -lt 4 ] && echo "$f"
done # | xargs rm
检查清单,如果它看起来OK,然后取出在最后一行的#
实际删除不需要的文件。
为什么要使用head -4
?由于wc
不知道什么时候退出。文本文件假设有一半是不是太字节长的每个以上;如果是单独的情况wc -l
将是非常缓慢的。
您可以使用wc
计算行,然后决定是要删除的文件或没有。你应该写一个shell脚本,而不是仅仅awk
命令。
您可以尝试的Perl。以下解决方案将是有效的作为文件句柄ARGV将被关闭,如果线计数> 3
perl -nle ' close(ARGV) if ($.>3) ; $kv{$ARGV}++; END { for(sort keys %kv) { print if $kv{$_}>3 } } ' *
如果你想管其他一些命令的输出(比如找到),你可以使用它像
$ find . -name "*" -type f -exec perl -nle ' close(ARGV) if ($.>3) ; $kv{$ARGV}++; END { for(sort keys %kv) { print if $kv{$_}>3 } } ' {} \;
./bing.fasta
./chris_smith.txt
./dawn.txt
./drcatfish.txt
./foo.yaml
./ip.txt
./join_tab.pl
./manoj1.txt
./manoj2.txt
./moose.txt
./query_ip.txt
./scottc.txt
./seats.ksh
./tane.txt
./test_input_so.txt
./ya801.txt
$
厕所-l *的放在同一个目录输出
$ wc -l *
12 bing.fasta
16 chris_smith.txt
8 dawn.txt
9 drcatfish.txt
3 fileA
3 fileB
13 foo.yaml
3 hubbs.txt
8 ip.txt
19 join_tab.pl
6 manoj1.txt
6 manoj2.txt
5 moose.txt
17 query_ip.txt
3 rororo.txt
5 scottc.txt
22 seats.ksh
1 steveman.txt
4 tane.txt
13 test_input_so.txt
24 ya801.txt
200 total
$