【问题标题】:awk to search multiple word pattern from one file in another fileawk 从另一个文件中的一个文件中搜索多个单词模式
【发布时间】:2013-05-30 08:21:48
【问题描述】:

第一个文件内容:

fruit bags    
nice things  
string guitar

第二个文件内容

bagsfruit  
nicefruit  
guitarstring  
simplethings  
stringguitar

我将如何编写 awk 程序来逐行搜索第二个文件中的第一个文件内容,并仅打印第二个文件中包含第一个文件中的任意顺序两个单词的行。..

所以脚本的结果应该是:

bagsfruit  
guitarstring  <--any order  
stringguitar  <--any order

但不是这些:

nicefruit  
simplethings

谢谢!

【问题讨论】:

    标签: awk design-patterns


    【解决方案1】:

    这可以工作:

    $ awk 'NR == FNR{a[$2$1];next} ($1 in a)' first_file second_file
    bagsfruit  
    guitarstring  
    

    代码基于来自Idiomatic awk的示例。

    基本上,它遍历 first_file 并创建一个数组a[],以fi[eld2 field1](即$2$1)作为索引。然后它会检查 second_file 中的哪些 field1 在数组 a[] 中并打印出来。


    更新

    $ awk 'NR == FNR{a[$2$1];a[$1$2];next} ($1 in a)' first_file seconf_file
    bagsfruit  
    guitarstring  
    stringguitar
    

    让我们每次创建两个数组索引,[$1$2][$2$1]

    【讨论】:

    • 但是如果它在第二个文件中不会给我stringguitar,它应该因为我需要以任何顺序出现的单词..谢谢:)
    • 用正确的输入/输出更新您的问题。解决方法可能是awk 'NR == FNR{a[$2$1];a[$1$2];next} ($1 in a)'
    • 所以如果我理解得很好,我们会创建索引fruitbags、bagfruit、nicethings、thingsnice 等。然后检查出现在这些索引中的第二个文件中的单词。但我不明白 awk 如何知道它应该索引第一个文件,然后在第二个文件中使用 $1?
    • 是的,我们按照您的说法创建索引,然后检查第二个文件中的单词。使用awk 'NR===FNR{block1} {block2}' file1 file2,基本上awk 对file1 中的内容执行block1,对file2 中的内容执行block2。请参阅我在答案中提供的链接以获得进一步的解释。
    • 是的,我会的......非常感谢你把我推向某个方向:))saludos!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2018-05-31
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多