簡體   English   中英

如何基於鍵和字符串匹配+ awk比較兩個文件

[英]How to compare two files based on key and string matching + awk

我有兩個文件要比較基於$ 1和$ 4作為鍵。 以下是示例文件:

File1.txt
ID_41088912_41091911    2999    4   BAD016,BAD036,BBD052    7
ID_73937477_73940042    2565    3   BAD016,BAD036,BAD052    7
ID_32904202_32912400    8198    4   BAD016,BAD036,BAD052    7

File2.txt 
ID_41088912_41091911    2998    4   BAD016  7
ID_73937477_73940042    2565    3   AAAD016 7
ID_32904202_32912400    8198    4   BAD036  7

在兩個文件中都以$ 1作為鍵進行搜索,如果鍵匹配,則應用第二個條件,如果File1的$ 4中不存在File2的$ 4中的字符串,則從file1中刪除該行。

Output:
ID_41088912_41091911    2999    4   BAD016,BAD036,BBD052    7
ID_32904202_32912400    8198    4   BAD016,BAD036,BAD052    7

從文件1中刪除第二行,因為$ 4,File2中的“ AAAD016”不存在於$ 4,File1中。

可以通過用記錄號索引的相關字段填充一個或多個數組來完成此匹配。 在以下腳本中,單個輸入字段4作為正則表達式與逗號分隔的字段4匹配,並且僅測試了字段1的等效性。

NR == FNR {
    # Check that $4 can be used as a pattern, this check
    # can be ommitted if the input is always valid.
    if ($4 !~ /^[[:alnum:]]+$/)
        exit 65; # EX_DATAERR
    a[NR] = $1;
    b[NR] = $4",|,"$4"|^"$4"$";
    next;
} $1 == a[FNR] && $4 ~ b[FNR]

上面的腳本應該先用file2調用

awk -f script file2 file1

對於大文件,使用getline逐行讀取文件時,可以應用相同的過程。

BEGIN {
    if (ARGC != 3)
        exit 64; # EX_USAGE
    while (getline <ARGV[1]) {
        a = $1;
        b = $4",|,"$4"|^"$4"$";
        # Check that $4 can be used as a pattern, this check
        # can be ommitted if the input is always valid.
        if (b !~ /^[[:alnum:]]+$/)
            exit 65; # EX_DATAERR
        getline <ARGV[2];
        if ($1 == a && $4 ~ b)
            print;
    }
    exit;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM