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
中的相同行
所以,为了说明,water
和 moors
由 File1
和 File2
共享,所以我的预期输出应该是:
1
3
意思是第 1 行和第 3 行由两个文件共享。
这是我尝试使用 awk
,但它不起作用:
awk '/substr(,1,5)/{ print NR; exit }' File2 File1
我的逻辑是提取 File2
中每行的前 5 个字符,然后打印它存在于 File1
中的行。
对于这道题,假设File1
中的每一行都是5个字符长。
您在 awk 中使用 substr
的方法似乎是解决此问题的方法。但是请注意,您必须 "play" 与 FNR
和 NR
并存储值以供进一步比较:
$ 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
我有两个文件:
文件 1:
water
doggy
moors
文件 2:
water1234
forge4432
moors5432
我需要将File2
中每一行的前5个字符与File1
中每一行的字符进行比较,以找出File1
中哪些行是相同的到 File2
所以,为了说明,water
和 moors
由 File1
和 File2
共享,所以我的预期输出应该是:
1
3
意思是第 1 行和第 3 行由两个文件共享。
这是我尝试使用 awk
,但它不起作用:
awk '/substr(,1,5)/{ print NR; exit }' File2 File1
我的逻辑是提取 File2
中每行的前 5 个字符,然后打印它存在于 File1
中的行。
对于这道题,假设File1
中的每一行都是5个字符长。
您在 awk 中使用 substr
的方法似乎是解决此问题的方法。但是请注意,您必须 "play" 与 FNR
和 NR
并存储值以供进一步比较:
$ 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