比较两个文件而不使用shell脚本对它们进行排序

时间:2013-07-30 07:51:33

标签: bash unix cmp

我有两个文件:fileafileb我不想排序(因此我无法使用comm)。

filea    fileb
cat      cat
dog      elephant
cat      snake
rabbit   pony

如果filea的内容与fileb的内容相同,则显示fileb中的内容,如果文件内容不同且file2包含elephant,则显示{{1} },如果是蛇,则显示ele,如果是小马,则显示sna

我尝试使用pon

cmp

但它没有显示任何内容。我希望输出位于第三个文件的列中。

3 个答案:

答案 0 :(得分:2)

如果与fileb相同,您似乎想要打印filea。如果它们不同,则需要打印filea中不存在的行的前3个字符。以下内容适用于您:

$ cmp -s filea fileb && cat fileb || { grep -v -f filea fileb | cut -c-3; }
ele
sna
pon

(上面的解释问题确实是对上述表达的解释。)

答案 1 :(得分:1)

使用awk而不对文件进行排序:

$ awk 'FNR==NR{a[$0];next}!($0 in a)' filea fileb
elephant
snake
pony

只打印差异的前3个字符:

$ awk 'FNR==NR{a[$0];next}!($0 in a){print substr($0,1,3)}' filea fileb
ele
sna
pon

要使输出位于新文件中,请使用重定向:

$ awk 'FNR==NR{a[$0];next}!($0 in a){print substr($0,1,3)}' filea fileb > filec

修改

FNR==NR       # Are we looking at the first file
a[$0]         # If so build an associative array of the file
next          # Go get the next line in the file
!($0 in a)    # In the second file now, check if the current line is in the array
print sub...  # If not print the first 3 characters from the current line

答案 2 :(得分:0)

AFAICR,如果文件相同,则cmp返回true。因此,if陈述没有任何内容就不足为奇了;文件不同。你需要一个else子句来查找file2中的三个单词并将它们截断为三个字符:

if cmp -s filea fileb
then cat fileb
else
    {
    grep elephant fileb
    grep snake fileb
    grep pony fileb
    } |
    sed 's/\(...\).*/\1/'
fi