【问题标题】:Compare what lines are missing in two files比较两个文件中缺少哪些行
【发布时间】:2022-01-12 21:59:24
【问题描述】:

我有两个文件 file1.txt 和 file2.txt

cat file1.txt

家庭/用户/城市/a/1.txt
主页/用户/状态/b/2.txt
家/用户/县/d/4.txt

cat file2.txt

/home/user/city/a/1.txt
/home/user/state/b/2.txt
/home/user/county/c/3.txt

我试图通过比较两个文件并打印丢失文件的完整路径来确定丢失了哪些 *.txt 文件。

预期输出

/home/user/county/c/3.txt
/home/user/county/d/4.txt

【问题讨论】:

  • comm 是你的朋友。请参阅BashFAQ #36——有些人试图将其与diff 一起破解,但它速度较慢并且消耗更多内存,尤其是在输入大小不受限制的情况下。
  • 请添加到您的问题(不发表评论):您搜索了什么,找到了什么?您尝试过什么,它是如何失败的?
  • 请将该示例输入的所需输出(无描述、无图像、无链接)添加到您的问题(无评论)。
  • Stack Overflow 用于编程问题,而不是关于使用或配置 Unix 及其实用程序的问题。 Unix & LinuxSuper User 将是解决此类问题的更好地方。
  • file1.txt 中缺少前导斜杠是故意的吗?

标签: bash shell


【解决方案1】:

comm -3 <(sed 's/^/\//' file1.txt | sort) <(sort file2.txt) | awk '{print $1$2}'

【讨论】:

  • 这不是为了鼓励发帖者的努力,而不是作为拨号编码器服务吗?还是该原则已被严重侵蚀以致其残余已被逐步淘汰?我错过了那份备忘录。
【解决方案2】:

试试diff。它告诉您第 2 行已更改 (2c2),并为您提供相应的行作为输出。

% diff <(sort file1 | sed 's/^/\//') <(sort file2)  
2c2
< /home/user/county/d/4.txt
---
> /home/user/county/c/3.txt

(也可以考虑使用comm,因为它通常已经完成了这项工作,正如其他帖子中所指出的那样)

【讨论】:

  • diff 在这里做了很多工作——尝试构建最短的转换,将 file1 转换为 file2——而comm 实现了一个非常简单的算法并且在它可能的 CPU 和内存空间。尽管排序后的文件不太可能执行diff 的最坏情况行为,但使用comm 可以更好地定义时间和内存行为。
  • @CharlesDuffy 我想这取决于用例。两者都在某些情况下大放异彩,尽管这无疑不是最适合diff 我认为它仍然值得了解。我将在正文中加入一句警告。
  • 这不是为了鼓励发帖者的努力,而不是作为拨号编码器服务吗?还是该原则已被严重侵蚀以致其残余已被逐步淘汰?我错过了那份备忘录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多