[英]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.