我有2个以竖线分隔的文件.昨日.txt和今天.txt

昨日.txt:

1234|12|Bill|Blatt|programmer
3243|34|Bill|Blatt|dentist
98734|25|Jack|Blatt|programmer
748567|31|Mark|Spark|magician

Today.txt

123|12|Bill|Blatt|programmer
3243|4|Bill|Blatt|dentist
934|25|Jack|Blatt|prograbber
30495|89|Dave|Scratt|slobber

I would like to compare the 2 files while ignoring the first 2 fields and output any lines unique to the second file (Today.txt), but I want the full lines even though the comparison is omitting the first 2 fields. So in the case above the output would be:

new_Today.txt

934|25|Jack|Blatt|prograbber
30495|89|Dave|Scratt|slobber

我试着用这个来完成:

sort <(cut -d"|" -f3- yesterday.txt) <(cut -d"|" -f3- yesterday.txt) <(cut -d"|" -f3- Today.txt) | uniq -u

这几乎是有效的,但它没有给我我削减的两块田地.我不确定该如何做到这一点.任何帮助都将不胜感激.

推荐答案

当第一个文件的大小不太大时,可以使用Awk而不进行排序来实现高效的解决方案:

awk -F'|' -v OFS='|' '
  NR == FNR {
    $1 = "";
    $2 = "";
    seen[$0]++;
 }
 NR != FNR {
   orig=$0;
   $1 = "";
   $2 = "";
   if (!seen[$0]) print orig
 }' today.txt new_today.txt`

一句俏皮话:awk -F'|' 'NR == FNR { $1 = ""; $2 = ""; seen[$0]++ } NR != FNR { orig=$0; $1 = ""; $2 = ""; if (!seen[$0]) print orig }' today.txt new_today.txt

对于示例输入文件,输出如下:

934|25|Jack|Blatt|prograbber
30495|89|Dave|Scratt|slobber

以下是它的工作原理:

  • 我们在命令行上将两个输入文件传递给awk脚本.这将是非常重要的.
  • -F'|'--使用管道作为字段分隔符.
  • 过滤器1:NR == FNR--匹配第一个输入文件中的行.
    • 我们构建了一个没有前两个字段的线条 map . 为此,我们清除前两个字段($1$2)的值,并使用其余字段($0)作为键,然后对其进行计数.
  • 过滤器2:NR != FNR--这与第一个输入文件中的第not行匹配.
    • 我们保存原始行,计算密钥,如果尚未看到,则打印原始行.

请注意,此方法还保留了第二个文件中各行的原始顺序.

Linux相关问答推荐

为什么在Linux上STD::SLEEP_FOR(STD::Chrono::Hors::Max())会立即返回?

没有发现运行时依赖关系,但它在S的运行时路径中有吗?

std::chrono::time_zone 在不同操作系统上不可用

将所有列乘以一个常数

将 Visual Studio C++ 项目迁移到 Linux 和 CMake

将特定列转换为行

如何在 Linux 上使用 -grep 构建过滤间隔的命令

树莓派拒绝连接到瓶子服务器

使用 Dockerfile RUN 执行某些操作但忽略错误

如何计算制表符分隔的文本文件中字段的唯一值的数量?

bash 中的sed命令

Bash 命令 :(){ :|:& };: 将产生进程导致内核死亡.你能解释一下语法吗?

对一行的最后一个字段进行排序

打印当前一周的星期一的日期(在 bash 中)

低功耗蓝牙:在 linux 中监听通知/指示

在 linux 上查看文件大小

Docker Volume 没有挂载任何文件

Supervisord - 将进程标准输出重定向到控制台

如何使用 bash 在文件中间添加一行文本?

在没有 python 命令的情况下在终端中运行 python 脚本