【问题标题】:Sort tow file using comm and sort function [duplicate]使用命令排序功能对两个文件进行排序[重复]
【发布时间】:2019-02-15 14:57:18
【问题描述】:

我想与 freeradius 数据库中的在线用户和 mikrotik 设备中的用户进行比较,所以我从 freeradius 检索在线用户并将它们插入到 file1 中,从 mikrotik 获取在线用户并将它们插入到 file2 中,现在我想获取用户在 file2 中找到但在 file1 中找不到 所以我使用了这段代码

我正在尝试获取在文件 2 中找到但在文件 1 中找不到的用户。

 comm -23 <(sort < file2) <(sort  file1)

但我有这个错误

Syntax error: "(" unexpected.

那么我的错误在哪里?

其实我对 bash 和 shell 不太了解,所以请帮帮我

【问题讨论】:

  • 看来你的 &lt; 对 file2 来说太多了
  • 你用的是什么外壳?并非所有常见的都支持 &lt;(command) 语法 - 包括用于 Ubuntu 的 /bin/sh 的破折号。
  • 您的直接问题可能是您使用sh 来执行 Bash 脚本。有关详细信息,请参阅第二个副本。

标签: bash shell ubuntu sh


【解决方案1】:

假设您的文件在 file1 中的每行包含 1 个用户名,那么像下面这样一个简单的一行应该可以满足您的需要,而无需对文件进行排序:

while read line; do if grep -q "$line" file2; then echo "user in both :" "$line"; fi; done < file1

【讨论】:

  • @tripleee 已修复
  • 如果文件非常大,效率也会低得多。
  • @Shawn,好的,但是您确定在比较它们之前对 2 个大文件进行排序会更有效吗?
  • 对于 file1 中的每一行,您最多可以查看 file2 中的每一行。这是一个嵌套循环。
  • @funkyjelly,...简短的回答是 GNU 排序已经过积极优化; f/e,如果您的输入太大而无法放入内存,它会将文件的子集排序到每个不同的临时文件中,并进行合并排序以将它们组合在一起。如果你有足够大的输入需要这种优化,相比之下,每行运行一次 grep 几乎是不可想象的低效(基于awk 的替代方案会很快耗尽内存)。
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
相关资源
最近更新 更多