2016-04-27 67 views
0

我有兩個文件需要根據$ 1和$ 4作爲鍵進行比較。下面是示例文件:如何比較基於密鑰和字符串匹配的兩個文件+ awk

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在這兩個文件中的關鍵,如果密鑰匹配,應用第二個條件是,如果從文件2在$ 4的字符串是不是在文件1 出現在$ 4取出排來自file1。

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

從$ file1的第二行在$ 4中被刪除爲「AAAD016」,File2在$ 4 File1中不存在。

+0

我有一個不成功的解決方案,它在尋找$ 1密鑰,但第二部分沒有完成! – chas

回答

0

這種匹配可以通過填充一個數組或數組來完成,並且使用相關字段,按記錄號索引。在下面的腳本中,單個輸入字段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; 
} 
+0

它不適用於製表符分隔文件嗎?嘗試使用-F「\ t」 – chas

+0

@chas它們都應該使用製表符分隔的文件,但如果字段分隔符僅爲製表符,則可能會出現混合空格/製表符文件的一些問題。 – kdhp

+0

@chas單行示例有一個錯字,它已被刪除。 – kdhp