【问题标题】:long file minus short file equal new file iterating through each line长文件减去短文件等于遍历每一行的新文件
【发布时间】:2011-12-08 20:09:38
【问题描述】:

我正在尝试 bash 编写此脚本,但似乎我问错了问题或找不到精炼的示例。

我正在获取两个包含列表的文件。

file1:

aa
bb
cc
dd
ee
ff

file2:

bb
dd
ff

创建file3 = file1 行-(匹配file2 中的行,file1 中的任意点)

file3:

aa
cc
ee

感谢任何帮助或指导。

【问题讨论】:

    标签: bash shell awk grep


    【解决方案1】:

    怎么样

     fgrep -v -f file2 file1
    

    【讨论】:

      【解决方案2】:

      如果可以使用文件,你可以使用这个:

      comm -2 -3 <(sort file1) <(sort file2)
      

      我认为描述你想要什么的一种雄辩的方式是相对互补或集合差异。事实上,complment 的 wikipedia page 有许多语言的代码示例,包括我上面的解决方案,没有内联排序。

      【讨论】:

      • 对迟到的回复表示歉意。我上周尝试了这个,最后得到了一个包含更多行的文件。所以我尝试了comm -2 -3 &lt;(sort smallfile) &lt;(sort largefile)comm -2 -3 &lt;(sort largefile) &lt;(sort smallfile) 两种方式都没有给我预期的结果。我今天将再次尝试使用 wiki。谢谢
      • 我不得不说,如果这对您不起作用,那么也许我不明白您的要求。我几乎 100% 确定它确实计算了两个文件的集合差异。
      【解决方案3】:

      如果file2 中的每一行都出现在file1 中,那就很简单了:

       sort file1 file2 | uniq -u
      

      如果文件无法排序并且你不知道上述条件是否为真(大约每一行),awk可以这样做:

      awk 'BEGIN { while ((getline line < "file2" > 0) {
                         f2[line]++
                   }
                 }
           f2[$0] > 0 { print }' file1
      

      注意:我不会将它与非常大的 file2 一起使用。

      【讨论】:

      • 真的很大吗?我的列表有 22K 行,文件大小只有 418KB。
      • 我尝试了排序,有些结果如何在文件中得到更多行3。我基本上需要file1-file2。是的,file2 中的所有行都应该在 file1 中。感谢您的宝贵时间。
      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2016-01-22
      • 2012-05-07
      • 2018-08-24
      • 2023-02-26
      • 1970-01-01
      相关资源
      最近更新 更多