Удалить текстовые файлы с менее чем тремя строками - PullRequest
0 голосов
/ 02 февраля 2019

Я использую скрипт Awk для разделения большого текстового документа на независимые файлы.Я сделал это, и теперь я работаю с текстовыми файлами 14k.Проблема здесь в том, что есть много файлов с тремя строками текста, и мне не полезно их хранить.

Я знаю, что могу удалить строки в тексте с awk 'NF>=3' file, но я нея не хочу удалять строки внутри файлов, скорее я хочу удалить файлы, содержимое которых состоит из двух или трех текстовых строк.

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Вы можете попробовать 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

$

вывод wc -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

$
0 голосов
/ 02 февраля 2019

Не могли бы вы попробовать выполнить команду find (протестировано с 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 {} \;
0 голосов
/ 02 февраля 2019

Если файлы в текущем каталоге являются текстовыми файлами, это должно быть эффективно и переносимо:

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

Проверьте список и, если он выглядит хорошо, удалите # в последнемстрока для фактического удаления ненужных файлов.

Зачем использовать head -4?Потому что wc не знает, когда выйти.Предположим, что половина текстовых файлов каждый имеет длину более терабайта;если бы это было так, wc -l было бы довольно медленно.

0 голосов
/ 02 февраля 2019

Вы можете использовать wc для вычисления строк, а затем решить, удалить файл или нет.Вы должны написать скрипт оболочки вместо простой команды awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...