linux - 比较 2 个长字符串并将结果写入第三个文件

标签 linux bash file awk

我正在编写最初的 bash 脚本,但陷入了需要论坛帮助的地方。

如何在shell脚本中实现以下内容? (任何建议/指示表示赞赏!!!)

要求:

比较 2 个匹配包含长字符串的 KEY 的文件,并仅在第三个文件中保留其他属性不同的长字符串(例如 USER 的值不同)。还跳过一些属性比较。

输入FILE1-

AAUTOX=Y;ACCT=;ACTION=C;APRICE=99.975;AQTY=5541;USER=Sam,bpl;CONFIRM=Y;KEY=29976DYE4;DEPT=MYNA-CLCD -- same
AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Todd,chr) write in result file

输入FILE2-

AAUTOX=Y;ACCT=;ACTION=C;APRICE=99.975;AQTY=5541;USER=Sam,bpl;CONFIRM=Y;KEY=29976DYE4;DEPT=MYNA-CLCD -- same
AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Alan,ncr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Alan,ncr) write in result file
AAUTOX=Y;ACCT=;ACTION=C;APRICE=17.000;AQTY=6453;USER=Todd,chr;CONFIRM=N;KEY=29976DYE6;DEPT=MYNA-CLCD -- no match (KEY) found write in result file

输出文件3:

FILE1:AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD 
FILE2:AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Alan,ncr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD


FILE1:

FILE2: AAUTOX=Y;ACCT=;ACTION=C;APRICE=17.000;AQTY=6453;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD

对于每条不同的行依此类推......

我心中的方法(先切后反刍改进):

  • 逐行读取 FILE1(awk 或 read??) 对于每条线
    • a) 读取 FILE2 以匹配唯一的“KEY”(这里使用哪个命令??? awk 可以根据键读取文件吗??? grep FILE2 中的 KEY 但如何将行分成字段进行比较?)
    • b) 现在比较 FILE1.LINE1 和 FILE2.LINE 的每个字段,如果不同则写入第三个结果文件(awk 将行分成字段 $1、$2,以便可以比较 虽然不知道如果使用“读取”命令该怎么办???)

最佳答案

这使用 GNU awk 4.* 进行排序 in (请参阅 http://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal ),您可以使用其他 awk 进行排序或以其他方式确定键顺序:

$ cat tst.awk
BEGIN { FS="[;=]" }
{
    delete name2val
    for (i=1; i<=NF; i+=2) { name2val[$i] = $(i+1) }
    key = name2val["KEY"]
    keys[key]
    recs[key,FILENAME] = $0
    for (name in name2val) { vals[key,FILENAME,name] = name2val[name] }
}
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"
    file1 = ARGV[1]
    file2 = ARGV[2]
    for (key in keys) {
        state = "SAME"
        if ( (key,file1) in recs ) {
            if ( (key,file2) in recs ) {
                for (name in name2val) {
                    if (name != "CONFIRM") {
                        if (vals[key,file1,name] != vals[key,file2,name]) {
                            state = "DIFF"
                        }
                    }
                }
            } else { state = "FILE1_ONLY" }
        } else { state = "FILE2_ONLY" }

        if (state != "SAME") {
            print file1":", recs[key,file1]
            print file2":", recs[key,file2]
            print ""
        }
    }
}

.

$ gawk -f tst.awk FILE1 FILE2
FILE1: AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Todd,chr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Todd,c
hr) write in result file
FILE2: AAUTOX=Y;ACCT=;ACTION=C;APRICE=05.975;AQTY=3451;USER=Alan,ncr;CONFIRM=N;KEY=29976DYE5;DEPT=MYNA-CLCD -- diff (USER=Alan,ncr) write in result file

FILE1: 
FILE2: AAUTOX=Y;ACCT=;ACTION=C;APRICE=17.000;AQTY=6453;USER=Todd,chr;CONFIRM=N;KEY=29976DYE6;DEPT=MYNA-CLCD -- no match (KEY) found write in result file

关于linux - 比较 2 个长字符串并将结果写入第三个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30758639/

相关文章:

c - 使用 libinput 获取原始多点触控数据

c++ - 我如何将数据通过管道传输到 bzip2 并从其在 Linux 上的 C++ 中的标准输出中获取结果数据?

php - 如何使用 BASH 从 MySQL 数据库中逐行提取数据

Bash 获取名称被另一个变量扩展的变量字符串的长度

C 中 deque 可以存储 char* 吗?

image - 在 Flutter Web 中显示所选图像

linux - Vim 复制一行并粘贴到多行

linux-kernel - 收集linux上所有连接的设备

bash脚本中的正则表达式排除某些单词

c - 程序未从文本文件的第一行读取某些字符