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