Bash - 比较两个文件并提取行相同的行号

Bash - compare two files and extract the line numbers where lines are identical

我有两个文件:

文件 1:

water
doggy
moors

文件 2:

water1234
forge4432
moors5432

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

中的相同行

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

1
3

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

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

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

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

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

您在 awk 中使用 substr 的方法似乎是解决此问题的方法。但是请注意,您必须 "play" 与 FNRNR 并存储值以供进一步比较:

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

说明

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

  • FNR==NR {} 读取第一个文件时,做{}.
  • 在这种情况下,{a[NR]=substr([=17=],0,5); next}:获取前 5 个字符并存储在 a[] 数组中。然后,移动到下一行。
  • a[FNR]== {print FNR}读取第二个文件时,将行的值与存储在数组a[]中的行值进行比较。如果匹配,打印行号。
sort <(cat -n <(cut -b 1-5 file1)) <(cat -n <(cut -b 1-5 file2)) | uniq -d | cut -b 1-6

输出:

     1
     3