首页 > 解决方案 > 我只需要使用 bash 从许多文件中过滤重复的行

问题描述

我有以下三个文件

文件

a
bc
cde

文件b

a
bc
cde
frtdff

文件c

a
bc
cddeeer
erer34

我可以通过这三个文件中的重复行进行过滤。我正在使用以下命令

ls file* | wc -l

返回 3。然后,我正在启动

sort file* | uniq --count --repeated | awk '{ if ($1 == 3) { print $2} }'

最后一个命令准确返回我需要的内容,以防我不创建更多以“文件”开头的文件。

但是,如果我在脚本运行期间需要创建数千个文件,我应该得到从这个命令中检索到的确切数量的文件

n=`ls file* | wc -l`
sort file* | uniq --count --repeated | awk '{ if ($1 == $n) { print $2} }'

不幸的是,变量 n 在 awk 命令的 if 条件中不被接受。

我的问题是我无法在作为 awk 命令一部分的 if 条件中使用变量 n 的值作为比较标准。

标签: bash

解决方案


您可以使用:

awk '!line[$0]++' file*

即使存在于多个文件和/或同一文件中,这也只会打印一次任何字符串。


推荐阅读