打印出现在awk的file2中的file1的字符串

时间:2019-06-29 06:33:13

标签: awk

我想在出现在file2中的file1中打印编程语言,在file2中打印其对应的行号,并在file2的完整行中打印。

file1像这样:

Ruby
Visual Basic
Objective-C
C
R
C++
Basic

file2像这样:

5. ab cde fg Java hij kl
2. ab PHP dddf llf 
4. cde fg z o Objective-C oode
8. a12b cde JavaScript kdk
6. ab99r cde Visual Basic llso dkd
1. lkd dsk Ruby kksdk
3. Python dsdls
9. CSS dkdsk
4. Jdjdj C Jjd Kkd
12. Iiii Jjd R Hhd
5. Jjjff C++ jdjejd
7. Jfjfjdoo Uueye Basic Jje Tasdk

我想得到这个输出:

 6|Ruby|1. lkd dsk Ruby kksdk
 5|Visual Basic|6. ab99r cde Visual Basic llsodkd            
 3|Objective-C|4. cde fg z o Objective-C oode
 9|C|4. Jdjdj C Jjd Kkd  
 10|R|12. Iiii Jjd R Hhd 
 11|C++|5. Jjjff C++ jdjejd
 12|Basic|7. Jfjfjdoo Uueye Basic Jje Tasdk 

其中6,5和3是file2中出现“ Ruby”,“ Visual Basic”和“ Objective-C”的行号。

到目前为止,我已经尝试使用下面的代码,但是仅当文件2与文件1进行比较时,该文件才具有完全匹配的列表。

awk 'NR == FNR{a[$0];next} ($0 in a)' file1 file2

在这种情况下,file2中的编程语言在前后都有一些文字,而我在如何获取所需的输出方面受困。

在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您能否请尝试(按照@Ed Morton先生的建议,将index更改为代码使用)。

awk -v OFS='|' '
FNR==NR{
  a[$0]
  next
}
{
  for(i in a){
     if(index(" "$0" "," "i" ")){
         print FNR,i,$0
     }
  }
}
'  Input_file1  Input_file2 | sort -t'|' -nr

输出如下。

6|Ruby|1. lkd dsk Ruby kksdk
5|Visual Basic|6. ab99r cde Visual Basic llso dkd
3|Objective-C|4. cde fg z o Objective-C oode

说明: 现在添加上述代码的说明。

awk -v OFS='|"' '                           ##Starting awk program here.
FNR==NR{                                   ##Checking condition FNR==NR which will be TRUE when first Input_file is being read.
  a[$0]                                 ##creating an array named a whose index is $0 and value is $0.
}
{                                          ##Starting block here.
  for(i in a){                             ##Starting a for loop here.
     if(index(" "$0" "," "i" ")){                   ##checking if value of a[i] array present in current line.
         print FNR,i,$0             ##If above is TRUE then print FNR"|"i"|"$0 as per OP need.
     }
  }
}
'  file1  file2 | sort -t'|' -nr           ##Mentioning Input_files names here and passing its output into sort command and sorting it with reverse order.

答案 1 :(得分:1)

使用GNU awk for sorted_in首先搜索最长的语言(例如Visual Basic),并在找到它们时将它们从当前行中删除,从而使较短的语言成为其中的一部分(例如{{1} })在其中找不到:

Basic