删除文本文件小于三行

问题描述 投票:2回答:4

我使用的是awk脚本来分割大文本文档为独立的文件。我做到了,现在我有14K的文本文件的工作。这里的问题是,有很多的文件只有三个文本行,它不是很有用,我让他们。

我知道我可以在awk 'NF>=3' file文本删除线,但我不希望删除线内的文件,而我想删除的文件,其内容只有两个或三个文本行。

提前致谢。

bash text awk
4个回答
3
投票

可否请您尝试以下findcommand。(与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 {} \;

2
投票

如果在当前目录下的文件都是文本文件,这应该是高效的和便携式:

for f in *; do 
    [ $(head -4 "$f" | wc -l) -lt 4 ] && echo "$f"
done  # | xargs rm

检查清单,如果它看起来OK,然后取出在最后一行的#实际删除不需要的文件。

为什么要使用head -4?由于wc不知道什么时候退出。文本文件假设有一半是不是太字节长的每个以上;如果是单独的情况wc -l将是非常缓慢的。


1
投票

您可以使用wc计算行,然后决定是要删除的文件或没有。你应该写一个shell脚本,而不是仅仅awk命令。


1
投票

您可以尝试的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

$
© www.soinside.com 2019 - 2024. All rights reserved.