unix - 在2个文本文件中找到不匹配的行

时间:2017-07-17 00:49:12

标签: unix awk grep diff comm

我试图做匹配和不匹配练习..我尝试尝试grep和diff ...但它只匹配整行......是否有可能匹配下面文件中的行?

如果我有2个文件:

文件1:

cat_cute    
green_apple_sour    
red_bean_big    
red_pepper_three    
ginger_yellow

文件2:

cat    
green_apple    
red_pepper    
papaya

输出:

(file1)
red_bean_big    
ginger_yellow            
(file2)    
papaya

在发布此问题之前,我已成功尝试使用以下方法。我很抱歉没有在我的第一篇文章中列出这一点。 我将文件2设置为目标匹配。对于文件1,我使用TCL删除所有不需要的形容词。然后我得到新文件1

newfile 1:

cat    
green_apple    
red_bean    
red_pepper    
ginger

然后我申请了:

grep -Fxvf newfile1 file2

我得到了我想要的输出。

我只是想知道是否有其他方法只使用没有TCL regsub进程的grep命令。我确实尝试过awk,comm和grep。它只匹配整行匹配100%。

谢谢。

2 个答案:

答案 0 :(得分:0)

在awk中:

$ awk '
NR==FNR {                  # first file
    a[$1]                  # hash entries to a
    next                   # next record
}
{                          # second file
    for(i in a)            # for each record go thru the whole of a
        if(i~$1||$1~i) {   # see if there is a match
            delete a[i]    # del if
            next           # and skip to next record
        }                  
    b[$1]                  # else store entry to b
}
END {                      # in the end
    print "(file1)" 
    for(i in a) 
        print i            # output a and
    print "(file2)"
    for(i in b) 
        print i            # b entries
}' file1 file2
(file1)
ginger_yellow
red_bean_big
(file2)
papaya

答案 1 :(得分:0)

我没有正确理解你的问题。顺便说一句,你可以通过awk轻松完成。

awk -F'_' 'FILENAME=="file2.txt" {a[$1$2]=$1$2} FILENAME=="file1.txt" {if(!(a[$1] || a[$1$2])) {print}}' file2.txt file1.txt

它将打印:

red_bean_big    
ginger_yellow

对于File2您可以撤消订单(稍作更改)。

awk -F'_' 'FILENAME=="file1.txt" {a[$1]=$1} FILENAME=="file2.txt" {if(!(a[$1])) {print}}' file1.txt file2.txt

以上命令将打印:

papaya

我希望我清楚地理解你的问题。如果您需要其他东西,请在下面评论。