linux - 在 AWK 中比较两个文件

标签 linux bash shell awk sed

我有两个 .txt 文件,我想检查一个文件的内容是否存在于另一个文件中。我的 Book1.txt 内容是:

PATX248
PATX216
PATX203
PATX219B
PATX212
PATX248
PATX211
PATX190
PATX222
PATX241
B8025
B1003
B8063
B8032
C0999
C1035
B1011

我的 InventorySheet2finaloutput.txt 是:

B8061P3 366-L4/26/2017 1
PATX-148 P3 4
 1003P4 M#1N-L1/19/2017
B1011P5 330-L2/23/2017 1
B8032P3 336-L3/10/2017 1
B1011P5 329-L2/14/2017 1
PATX-60P5 279-L2/8/2017 1
PATX-70 P3 5
B1573P6 1R-R8/10/2017 1
B8025 P4 5
B8025 P5 1
 1061P3 372-R4/26/2017
 2078 P4M#1RR-R8/25/2017
C0999 P5 4
B8078 P4M#1N-R8/25/2017 2
C-1008 P4 1
PATX-55 P4 4
B1003P5 325-R3/3/2017 1
PATX-45P4 266-L2/14/2017 1
B8032P4 384-R4/26/2017 1
C-1035 P3 1
B8032P3 340-R3/17/2017 1

输出:

B1003P5 325-R3/3/2017 1
B8032P3 336-L3/10/2017 1
B8032P4 384-R4/26/2017 1
B8032P3 340-R3/17/2017 1
C0999 P5 4
C-1035 P3 1
B1011P5 330-L2/23/2017 1
B1011P5 329-L2/14/2017 1

我已经使用了我可以在谷歌上搜索到的所有解决方案,它们都得到执行但没有打印结果。我尝试过的解决方案是:

  1. grep -v -F -x -f Book1.txt InventorySheet2finaloutput.txt(尝试了 grep 所有形式的标志)
  2. awk 'NR == FNR {Book1[$0]++; next} ($0 in Book1)' Book1.txt InventorySheet2finaloutput.txt
  3. awk 'NR==FNR{a[$1];next}$1 in a{print $1}' Book1.txt InventorySheet2finaloutput.txt
  4. grep "$(cat Book1.txt)"InventorySheet2finaloutput.txt

我想知道 Book1 的内容是否存在于 InventorySheet 中。

最佳答案

哦,我现在明白了:Book1 的内容应该是 InventorySheet 行的前缀(似乎还有一个可选的连字符)。因此,给定 Book1 中的 B1003,我们匹配 InventorySheet 中的 B1003P5 行。或者 C1035 匹配 C-1035

grep -Ef <(sed -E 's/^/^/; s/([[:alpha:]])([[:digit:]])/\1-?\2/' Book1) InventorySheet

它使用 sed 从 Book1 文件生成扩展的正则表达式,并且进程替换允许 grep 一个“伪文件名”。

给定你的示例文件,这输出

B1011P5 330-L2/23/2017 1
B8032P3 336-L3/10/2017 1
B1011P5 329-L2/14/2017 1
B8025 P4 5
B8025 P5 1
C0999 P5 4
B1003P5 325-R3/3/2017 1
B8032P4 384-R4/26/2017 1
C-1035 P3 1
B8032P3 340-R3/17/2017 1

在 awk 中,这将是

awk '
    NR==FNR {book[$1]; next}
    { 
        key=$1
        gsub(/-/, "", key)
        for (b in book) 
            if (key ~ "^"b) {print; break}
    }
' Book1 InventorySheet

关于linux - 在 AWK 中比较两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46476466/

相关文章:

c++ - 如何在 C++ 中确定 Linux 套接字绑定(bind)到哪些接口(interface)

c# - 有没有办法通过 pdfsharp 项目修复 Linux 上的 user32.dll 错误?

php - LAMP 环境变量 ($PATH) 出现问题

linux - 带有当前目录的 bash 前缀输出

react-native - 无法运行 adb shell "date ` 日期 +%m%d%H%M%Y.%S`"

linux - 如何在 zsh 或 bash 中获取逻辑 CPU 的数量?

python - python脚本的shell启动/停止

bash - 如何弄清楚为什么我的 shell 会崩溃?

arrays - 使用 du 定义遍历目录的数组

linux - 管道到 less -S 而不清除命令行历史记录的输出