【问题标题】:get common lines from two text files [closed]从两个文本文件中获取公共行[关闭]
【发布时间】:2013-06-30 17:57:24
【问题描述】:

我有两个文件。

第一个(file1)是这样的: (“文本”行之前总是有一个标题行)

>random header name1
wonderfulstringwhatsoevergoeson
>random header 2
someotherline
...

另一个文件(file2)是file1的修改文件,如: (标题已被删除,行被打乱,添加了一个新标题)

>name
someotherline
wonderfulstringwhatsoevergoeson

file1 的每一行(不包括标题)都出现在file2 中。 file2 中的行顺序与 file1 不同。 两个文件应保持原样。

file2中的每一行

输出应该是类似的: (file2的标头可以忽略)

>random header 2
>random header name1

有人知道怎么做吗?

最好的问候

【问题讨论】:

  • 我向你保证,它们可以排序。
  • 什么意思:不能排序?它们太大了吗?或者它是流,而不是文件本身?这很重要,因为不可排序的原因可能会限制您的选择。一般来说,据我了解 - 您想找到两个文件中唯一的行。这通常可以通过以下方式完成:cat files* | sort | uniq -u
  • @depesz:为了避免无用的管道蛇使用sort files*|uniq -u
  • @TrueY - 好吧,好吧。无论如何,我倾向于使用“cat”,因为将这样的行重用于其他任务更简单,而且 cat 开销可以忽略不计,但如果这会让你开心 - 我会使用你的,无猫的版本 :)
  • 我认为第二个file1 looks like this: 应该引用file2,不是吗? file2 中的>name 怎么样?不需要在输出中显示?

标签: regex perl sed awk pattern-matching


【解决方案1】:

鉴于文件应保持不变的说明,只需使用:

sort file1 file2 file2 | uniq -u

你就完成了。

或者,如果文件很大,那么 (file1+file2+file2) 的排序负担太大,你可以使用这个:

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

这将对每个文件进行排序(磁盘上的文件将保持原样,不会被修改),然后打印文件1中存在但文件2中不存在的行。

例子:

=$ cat file1 
some header
abc
cdf
efg
other header

=$ cat file2 
file2 header
cdf
file2 header part2
efg
abc

=$ comm -23 <( sort file1 ) <( sort file2 )
other header
some header

【讨论】:

    【解决方案2】:

    GNU 代码

    $sed '/^[>]/N;s#\(.*\)\n\(.*\)#/\2/s/.*/\1/p#' file1|sed -nf - file2 >随机标题2 >随机标题名称1

    【讨论】:

    • 非常感谢!你解决了我的问题:)
    【解决方案3】:

    如果我理解正确,您希望从 file1 打印与 file2 的每个元素相对应的相应标题。

    #!/bin/bash
    
    cat file2 | 
    while read line; do 
        grep -B 1 "$line" file1 | head -n1
    done
    

    grep -B 1 将在匹配前打印一行。我们可以将第一行逐头剪掉。
    这可能被称为黑客攻击。 (但我仍然是初学者)。

    文件1:

    >随机标题名称1
    美妙的弦乐无常
    >随机标题 2
    另一条线

    文件2:

    其他线路
    美妙的字符串whatsoevergoeson

    输出:

    >随机标题 2
    >随机标题名称1

    也理解 depesz 指出的这个解决方案很慢。

    【讨论】:

    • 这种方法会相当慢,因为它必须 grep file2 N 次,其中 N 是 file2 中的行数。另外,我不确定这是否是 OP 想要的,但我让他来判断,因为我也不确定我是否理解他的描述。
    • @mohit 非常感谢!这与我搜索的内容非常接近!如果标题是前面一行而不是同一行,我该怎么办?
    • @user2525078 已更正。
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多