【问题标题】:Find matching pattern of first columns between two files and print the line from each file in a third file查找两个文件之间第一列的匹配模式并打印第三个文件中每个文件的行
【发布时间】:2015-01-22 21:08:43
【问题描述】:

我有两个文件,一个包含服务器名称和 IP,另一个包含服务器名称和机器名称,例如。这些文件没有真正的顺序。我尝试过使用 Sort、awk 和 sed 的变体。但是第一个文件维护得不是很好,并且包含虚假数据,这些数据抵消了我计划这样做的方式。

我试图在两个文件之间进行基本模式匹配,仅用于两行中包含的服务器,并将两个文件中的行中的数据打印在第三文件的一行上。

文件 1:

Server1 10.10.10.1
Server2 10.10.10.2
....
Server154 10.10.30.8
Server155 10.10.30.9

文件 2:

Server1 site site1
Server2 site site2
....
Server154 site site154
Server155 site site155

输出:

Server1 10.10.10.1 site site1
Server2 10.10.10.2 site site2
...
Server154 10.10.30.8 site site154
Server155 10.10.30.9 site site155

【问题讨论】:

    标签: perl sed awk


    【解决方案1】:

    这应该可以解决问题:

    $ awk 'FNR==NR{a[$1]=$0;next}($1 in a){print a[$1],$2,$3}' file1 file2
    Server1 10.10.10.1 site site1
    Server2 10.10.10.2 site site2
    Server154 10.10.30.8 site site154
    Server155 10.10.30.9 site site155
    

    【讨论】:

    • 完美运行。非常感谢
    • 是的,显然他们的计时器,我不得不等待 2 分钟才让我,你只是为了快。 :D
    【解决方案2】:

    可以通过在 BEGIN 中用第一个文件填充一个数组,然后将第二个文件与该数组匹配来解决。

    awk -v f1="file1.txt" 'BEGIN { while (getline < f1) { keys[$1]=$2 } ; close(f1) }
       keys[$1] { print }' file2.txt
    

    【讨论】:

    • 这不会产生所需的输出,并且这种使用 getline,BEGIN-v 是不好的做法。
    • 所有这一切都是在file2 中打印行,如果在file1 中也找到第一个字段,则它不会加入输出。 Getline -> awk.info/?tip/getline
    • 我不同意。使用“-v”的目的是让我不必在 BEGIN 语句中写完整的文件名,只写变量。您引用的文章中“应用程序”中的示例 c 适用于首先读取稍后引用的数据,这正是我的示例的重点。创建正确的输出格式是 OP 的练习。如果这在 stackoverflow 上不正确,我表示歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2021-06-26
    相关资源
    最近更新 更多