Linux

文件比較錯誤 - awk

  • May 24, 2015

我有兩個文件file1.txtfile2.txt. 我想根據第 2 列和第 3 列選擇兩者共有的記錄,並將它們複製到file1.txt附加列(第 4 列來自)。file2.txt``out.txt``file2.txt

樣本輸入:

file1.txt

abc 1 a f11 f13 f14 
abd 2 b f12 f14 f13  
abe 4 d f13 f16 f12 
acf 5 s f14 f15 f19

file2.txt

abc 1 a f21 f23 f24 
abd 1 b f21 f24 f23  
abe 4 d f24 f26 f22 
acf 6 s f23 f25 f29

期望的輸出

out.txt

abc 1 a f11 f13 f14 f21
abe 4 d f13 f16 f12 f24

我之前問過一個類似的問題,關於如何處理三個文件並根據類似的輸入提取類似的輸出以便更好地理解。我是 Unix 世界的新手,一直在學習如何進行文件處理。基於此,我嘗試使用以下程式碼,awk但沒有成功。有人可以檢查並建議,出了什麼問題?

awk 'FILENAME == ARGV[1] {
   m[$2,$3] = 0; z[$2,$3] = $6;
   next;
}
{
   if (($2,$3) in m && m[$2,$3] == 1) {
       print $0 " " z[$2,$3] >"out.txt";
   }
}' file2.txt file1.txt

在您的範例中,您正在創建值為 0 的數組 m。您沒有將其設置為 1,並且您不需要。您可以將值設置為整行,例如 $0。

試試這個:

awk 'FILENAME == ARGV[1] {
   m[$2,$3] = $0;
   next;
}
{
   if (($2,$3) in m) {
       print m[$2,$3] " " $4 >"out.txt";
   }
}' file1.txt file2.txt

awk

awk 'FNR==NR      {
                    a[$2, $3]=$4
                    next
                 }
    ($2, $3) in a{
                    print $0, a[$2, $3]
                 }
   ' file2.txt file1.txt > out.txt

加入

join -j 2 \
   <(sort -k2,3 file2.txt | sed 's/ /+/2') \
   <(sort -k2,3 file1.txt | sed 's/ /+/2') \
   -o 1.1,1.2,1.3,1.4,1.5,2.3 |
       sed 's/+/ /' > out.txt

引用自:https://unix.stackexchange.com/questions/205121