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

时间:2015-01-25 19:32:20

标签: bash awk

我有两个文件:

File1中:

water
doggy
moors

文件2:

water1234
forge4432
moors5432

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

中的相同行

因此,为了说明,watermoors共享File1File2,因此我的预期输出应为:

1
3

含义第1行和第3行由两个文件共享。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

你在awk中使用substr的方法似乎就是这样的。但请注意,您必须与FNRNR“玩”并存储值以进行进一步比较:

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

解释

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

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

答案 1 :(得分:1)

sort <(cat -n <(cut -b 1-5 file1)) <(cat -n <(cut -b 1-5 file2)) | uniq -d | cut -b 1-6

输出:

     1
     3