linux - 比较管道分隔文件并将不匹配的列写入输出文件

标签 linux bash

我有两个文件 abc.txt

||||||FARGO||916244244||0923206||0923206|00752341039|092320600752341039|09232060075234103900001|WHITE|||||||80903|
||||||JOHN||977428452||0923206||0923206|00752341029|092320600752341029|09232060075234102900001|SHORT|||||||80903|
||||||RIYA||967688294||0923206||0923206|00752341037|092320600752341037|09232060075234103701001|BROOKS|A|||||80903|

def.txt

||||||FARGOA||916244244||0923206||0923206|00752341039|092320600752341039|09232060075234103900001|WHITE|||||||90001
||||||JOHNA||977428452||0923206||0923206|00752341029|092320600752341029|09232060075234102900001|SHORT|||||||90001
||||||RIYAA||967688294||0923206||0923206|00752341037|092320600752341037|09232060075234103701001|BROOKS|A|||||90001

我应该能够按列比较两个文件,然后将不匹配的列写入以管道分隔的输出文件

预期输出:

FARGO|80903  
FARGOA|90001  

JOHN|80903  
JOHNA|90001  

RIYA|80903  
RIYAA|90001  

最佳答案

我会做这样的事情来比较两个文件中的记录

awk  -F'|' -v OFS='|' '
    NR == 1 {print "line","field",FILENAME,compareto}
    {
        getline line < compareto
        n = split(line, ary)
        max = n>NF ? n : NF
        for (i=1; i<=max; i++) if ($i != ary[i]) print FNR, i, $i, ary[i]
    }
' compareto=def.txt abc.txt
line|field|abc.txt|def.txt
1|7|FARGO|FARGOA
1|24|80903|90001
2|7|JOHN|JOHNA
2|24|80903|90001
3|7|RIYA|RIYAA
3|23|80903|90001

关于linux - 比较管道分隔文件并将不匹配的列写入输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52539427/

相关文章:

linux - 波兰语文本出现 msgfmt "invalid multibyte sequence"错误

linux - centos中web应用的x和r权限

linux - linux服务器上保存命令历史记录的所有位置在哪里

linux - 在 shell 脚本中执行时,ssh 命令显示没有此类文件或目录

bash - 如何复制带有符号链接(symbolic link)的目录并解决它们?

linux - 防止从 Node.js 应用程序直接访问 Url

linux - 在 CentOS5 Box 上运行 Ubuntu 12.04 编译的 C++ 程序

bash - HDFS 上的 Snappy 压缩文件没有扩展名且不可读

bash - shell脚本中的这一行是做什么的?

c++ - epoll_wait() > 1 可以只有 1 个套接字和 1 个事件——EPOLLIN 吗?