【问题标题】:Using awk to parse through two files ignoring values使用 awk 解析两个忽略值的文件
【发布时间】:2013-06-18 15:23:12
【问题描述】:

我有两个文件,正在尝试制作第三个。在 fileA 中,我有一个静态数字列表。在 fileB 中,我也有一个静态数字列表。我想使用 awk 从 fileB 中获取数字,通过 fileA 解析,然后创建一个 fileC。 FileC 将是 fileA 忽略它从 fileB 看到的任何内容。

更多文件*

fileA

99882105030=10.10.2.3=
99882152121=10.10.2.3=
99882152122=10.10.2.3=
99882152123=10.10.2.3=
99882152124=10.10.2.3=
99882278940=10.10.2.3=
99882278969=10.10.2.3=
99883340691=10.10.2.3=
99883349708=10.10.2.3=
99883349755=10.10.2.3=

fileB (numbers that should be ignored)

99882105030
99882152121
99882152122
99882152123

fileC (file created from output of fileA and fileB)

99882278940=10.10.2.3=
99882278969=10.10.2.3=
99883340691=10.10.2.3=
99883349708=10.10.2.3=
99883349755=10.10.2.3=

到目前为止我已经尝试过:

awk 'FNR==NR { a[$NF]; next } ($NF in a)' fileB fileA > fileC

没有运气。我知道我可以 grep -v -E "99882105030|99882152121" ... 心满意足,但是这个文件可能会变得非常大,我不想做一个 for 循环。有接盘侠吗?

perl -p -e 's:\n:\|:g' fileB |\
sed 's:^:grep -v -E ":g;s:|$:":g;s:$: fileA > fileC:g | sh

实在是太丑了

【问题讨论】:

    标签: awk grep


    【解决方案1】:
    awk -F= 'NR==FNR{a[$1]++;next}!($1 in a)' fileB fileA > fileC
    

    【讨论】:

    • @munkeyoto 您使用的是$NF,它返回字符数。
    【解决方案2】:

    可以使用awk 来完成,但在这种情况下,我认为grep -f 会派上用场:

    $ grep -wvf fileB fileA
    99882152124=10.10.2.3=
    99882278940=10.10.2.3=
    99882278969=10.10.2.3=
    99883340691=10.10.2.3=
    99883349708=10.10.2.3=
    99883349755=10.10.2.3=
    
    • -v 用于反向匹配。
    • -f 用于文件匹配。
    • -w 用于单词匹配。
    • > fileC 以备不时之需。我发布了没有此重定向的代码以直接显示输出。

    注意这一行

    99882152124=10.10.2.3=
    

    没有出现在您想要的输出中,尽管我认为它应该出现。

    【讨论】:

    • ;) 说得好,确实像一个魅力。所以习惯于大多数时候使用 awk 和 sed 解析进出...即使使用 awk AS grep: awk '/THIS_PATTERN/{print}' 文件或 awk '!/IGNORE_THIS_ONE/{print}'
    • 很高兴阅读它对您很有用。在 awk 中,可以使用 backreference.org/2010/02/10/idiomatic-awk 中给出的一些代码来完成,但我认为 grep 在这种情况下胜出,是一种更强大、更简单的方法。
    • 确实容易多了
    【解决方案3】:

    GNU sed

    sed -r 's#(.*)#/\1/d#' fileB | sed -f - fileA
    

    ..输出:

    99882152124=10.10.2.3= 99882278940=10.10.2.3= 99882278969=10.10.2.3= 99883340691=10.10.2.3= 99883349708=10.10.2.3= 99883349755=10.10.2.3=

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2011-05-11
      • 2022-12-17
      • 2018-10-27
      • 2021-12-27
      相关资源
      最近更新 更多