【发布时间】:2019-06-29 06:33:13
【问题描述】:
我想打印 file1 中出现在 file2 中的编程语言、它在 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 是文件 2 中出现“Ruby”、“Visual Basic”和“Objective-C”的行号。
到目前为止,我已经尝试过使用下面的代码,但该代码仅在文件 2 与文件 1 比较时具有完全匹配列表时才有效。
awk 'NR == FNR{a[$0];next} ($0 in a)' file1 file2
在这种情况下,file2 中的编程语言在前后都有一些文本,我被困在如何获得我想要的输出。
提前感谢您的帮助。
【问题讨论】:
-
作为测试用例,您应该在 file1 中包含
C和C++以验证编程语言是否被视为完整字符串,而不是部分字符串或正则表达式,并且您应该在 file2 中包含以下行包含多种编程语言,以确保脚本不只是找到一种。还将Basic添加到file1 并显示如果file1 同时包含Basic和Visual Basic时的预期输出应该是什么 -
@EdMorton 非常感谢您关于添加 C、C++ 和 Basic 的建议。我还在两个文件和 Ravinder 的代码中都包含了 R,它可以正确打印除
Basic之外的所有代码,因为它打印出现 Visual Basic 和 Basic 本身的行。对于Basic应该只打印Basic出现而不是Visual Basic的行 -
不客气。但是,您应该将提到的案例添加到问题中的示例中,而不仅仅是添加到桌面上的文件中。
-
@EdMorton 我已经编辑了 file1、file2 和输出。感谢您的建议
标签: awk