我想在出现在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中的编程语言在前后都有一些文字,而我在如何获取所需的输出方面受困。
在此先感谢您的帮助。
答案 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