我有两个文件:filea
和fileb
我不想排序(因此我无法使用comm
)。
filea fileb
cat cat
dog elephant
cat snake
rabbit pony
如果filea
的内容与fileb
的内容相同,则显示fileb
中的内容,如果文件内容不同且file2包含elephant,则显示{{1} },如果是蛇,则显示ele
,如果是小马,则显示sna
。
我尝试使用pon
:
cmp
但它没有显示任何内容。我希望输出位于第三个文件的列中。
答案 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