0

我有两个文件:fileafileb不想排序(所以我不能使用comm)。

filea    fileb
cat      cat
dog      elephant
cat      snake
rabbit   pony

如果 的内容与 的内容filea相同,fileb则显示fileb其中的内容,如果文件的内容不同且file2包含大象则显示ele,如果蛇则显示sna,如果小马则显示pon

我尝试使用cmp

if cmp -s filea fileb
then echo $"fileb"
fi

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

4

3 回答 3

2

如果fileb它与filea. 如果它们不同,则要打印filea. 以下内容应该适合您:

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

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

于 2013-07-30T08:19:12.423 回答
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
于 2013-07-30T08:08:01.770 回答
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
于 2013-07-30T08:04:39.103 回答