【问题标题】:Bash - compare two files and extract the line numbers where lines are identicalBash - 比较两个文件并提取行相同的行号
【发布时间】:2015-01-25 19:32:20
【问题描述】:

我有两个文件:

文件1:

water
doggy
moors

文件2:

water1234
forge4432
moors5432

我需要比较File2中每行的前5个字符与File1中每行的字符,以便找出File1中的哪些行与File2中的相同行

因此,为了说明,watermoorsFile1File2 共享,所以我的预期输出应该是:

1
3

意思是第 1 行和第 3 行由两个文件共享。

这是我尝试使用awk,但它不起作用:

awk '/substr($1,1,5)/{ print NR; exit }' File2 File1

我的逻辑是提取 File2 中曾经行的前 5 个字符,然后打印它存在于 File1 中的行。

对于这个问题,假设File1 中的每一行都是5 个字符长。

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您在 awk 中使用 substr 的方法似乎是解决这个问题的方法。但请注意,您必须“玩”FNRNR 并存储这些值以供进一步比较:

    $ awk 'FNR==NR{a[NR]=substr($0,0,5); next} a[FNR]==$1 {print FNR}' f2 f1
    1
    3
    

    说明

    这会读取文件 2,然后读取文件 1。读取第一个时,它将前 5 个字符存储到数组 a[] 中,使用行号作为索引。然后,它不断将这些值与第二个文件进行比较,并在匹配时打印该行。

    • FNR==NR {} 读取第一个文件时,执行{}
    • 在这种情况下,{a[NR]=substr($0,0,5); next}:获取前 5 个字符并存储在 a[] 数组中。然后,移至下一行。
    • a[FNR]==$1 {print FNR} 读取第二个文件时,将该行的值与该行号存储在数组a[] 中的值进行比较。如果匹配,则打印行号。

    【讨论】:

      【解决方案2】:
      sort <(cat -n <(cut -b 1-5 file1)) <(cat -n <(cut -b 1-5 file2)) | uniq -d | cut -b 1-6
      

      输出:

      1 3

      【讨论】:

        猜你喜欢
        • 2015-05-23
        • 2017-07-19
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        相关资源
        最近更新 更多