Shell 从文件中删除孤立行

Shell 从文件中删除孤立行,shell,duplicates,find,Shell,Duplicates,Find,我使用fdupes列出重复的文件。例如: ./topic/org-batch/.svn/pristine/45/45e578cf6c4723c6853b788e6ae35c1705fe9b19.svn-base ./topic/org-batch/Makefile ./topic/org-batch/lisp/sword-mode.el ./home/.emacs.d/lisp/sword-mode.el ./home/.emacs.d/lisp/sword-mode-bak.el ./to

我使用
fdupes
列出重复的文件。例如:

./topic/org-batch/.svn/pristine/45/45e578cf6c4723c6853b788e6ae35c1705fe9b19.svn-base
./topic/org-batch/Makefile

./topic/org-batch/lisp/sword-mode.el
./home/.emacs.d/lisp/sword-mode.el
./home/.emacs.d/lisp/sword-mode-bak.el

./topic/org-batch/.svn/pristine/2a/2a87de13f3959748235f2a9735b0d7da40ef8545.svn-base
./topic/org-batch/bin/orgmk-stow-orgmk.mk

./home/.emacs.d/elpa/auctex-12.1.1/COPYING
./home/.emacs.d/elpa/org-plus-contrib-20180813/COPYING

./topic/org-batch/.svn/pristine/1e/1ebac4e8f3174f5da74469ad0bf5714ed901233e.svn-base
./topic/org-batch/bin/orgmk-init
不过,上面的一些(SVN中的副本)是正常的重复文件

因此,我从
.git
.svn
目录中筛选出这些合法副本:

fdupes -r . \
    | grep -v "/.svn/" \
    | grep -v "/.git/" \
    | uniq
但我在报告中有一些孤立的句子:

./topic/org-batch/Makefile

./topic/org-batch/lisp/sword-mode.el
./home/.emacs.d/lisp/sword-mode.el
./home/.emacs.d/lisp/sword-mode-bak.el

./topic/org-batch/bin/orgmk-stow-orgmk.mk

./home/.emacs.d/elpa/auctex-12.1.1/COPYING
./home/.emacs.d/elpa/org-plus-contrib-20180813/COPYING

./topic/org-batch/bin/orgmk-init
我不必在意这些…因为它们不是我必须删除的副本

如何删除仅由一行组成的块?

目标报告:

./topic/org-batch/lisp/sword-mode.el
./home/.emacs.d/lisp/sword-mode.el
./home/.emacs.d/lisp/sword-mode-bak.el

./home/.emacs.d/elpa/auctex-12.1.1/COPYING
./home/.emacs.d/elpa/org-plus-contrib-20180813/COPYING

awk可能会有帮助。通过重置输入和输出记录分隔符(ORS)中的变量记录分隔符(RS)和字段分隔符(FS),可以重新定义分隔行(记录)或行中字段的内容。如果将这些设置为将双换行符(\n\n)作为记录分隔处理,将单换行符(\n)作为字段分隔处理,则可以通过检查大于1(NF>1)的字段数找到包含多个换行符的每个记录。这些应该是具有多行的块:

awk 'BEGIN {RS="\n\n";ORS="\n\n";FS="\n"}  {if(NF>1) print}' 
例如,看看这里

附言:
如果最后一行的末尾有一个\n,则可能会出现问题。

您能告诉我您需要的确切输出吗?喜欢(前后版本)谢谢你的评论。请参见上面编辑的问题。会出现什么问题?在无用的时候被打印出来,或者在有用的时候不被打印出来?剩下的对你有用吗?如果最后一行
/topic/org batch/bin/orgmk init
末尾包含换行符(\n),则不会将其过滤掉,因为它被解释为带有两个字段的记录。您可以通过使用前面输入中描述的
perl-pe“chomp if eof”
来避免这种情况。一个块过多没有问题,比一个不打印的块要好得多。谢谢