我必须将一些数据放在一个应该是唯一的文件中。 假设在 file1我有以下数据。
ABC
XYZ
PQR
现在我想添加MNO DES ABC
然后它应该只复制“MNO”和“DES”,因为“ABC”已经存在。
file1应该看起来像
ABC
XYZ
PQR
MNO
DES
(ABC应该只有一次。)
答案 0 :(得分:1)
使用fgrep
:
fgrep -vf file1 file2 > file2.tmp && cat file2.tmp >> file1 && rm file2.tmp
获取不在file2
中的所有file1
行,并将结果追加到file1
。
您可能需要查看此帖子:grep -f maximum number of patterns?
答案 1 :(得分:1)
最简单的方式:此sholud在f1
diff -c f1 f2|grep ^+|awk -F '+ ' '{print $NF}' >> f1
或者如果'+'将成为实际文本的一部分:
diff -c f1 f2|grep ^+|awk -F '+ ' '{ for(i=2;i<=NF;i++)print $i}' >> f1
shell脚本方式:
我有比较行数,比较行数/长度等。但是对于你的要求我认为下面部分应该做的工作....
<强>输入强>
$ cat f1
ABC
XYZ
PQR
$ cat f2
MNO
DES
ABC
脚本* 后输出
$ ./compareCopy f1 f2
-----------------------------------------------------
comparing f1 f2
-----------------------------------------------------
Lines check - DONE
$ cat f1
ABC
XYZ
PQR
DES
MNO
#!/bin/sh
if [ $# != "2" ]; then
echo
echo "Requires arguments from command prompt"
echo "Usage: compare <file1> <file2>"
echo
exit
fi
proc="compareCopy"
#sort files for line by line compare
cat $1|sort > file1.tmp
cat $2|sort > file2.tmp
echo "-----------------------------------------------------"
echo " comparing $1 $2" |tee ${proc}_compare.result
echo "-----------------------------------------------------"
file1_lines=`wc -l $1|cut -d " " -f1`
file2_lines=`wc -l $2|cut -d " " -f1`
#Check each line
x=1
while [ "${x}" -le "${file1_lines}" ]
do
f1_line=`sed -n ${x}p file1.tmp`
f2_line=`sed -n ${x}p file2.tmp`
if [ "${f1_line}" != "${f2_line}" ]; then
echo "line number ${x} don't match in both $1 and $2 files" >> ${proc}_compare.result
echo "$1 line: "${f1_line}"" >> ${proc}_compare.result
echo "$2 line: "${f2_line}"" >> ${proc}_compare.result
# so add this line in file 1
echo $f2_line >> $1
fi
x=$[${x} +1]
done
rm -f file1.tmp file2.tmp
echo "Lines check - DONE" |tee -a ${proc}_compare.result
答案 2 :(得分:0)
Perl one liner
文件一:
1
2
3
文件二:
1
4
3
仅打印唯一行
perl -lne 'print if ++$n{ $_ } == 1 ' file_one.txt file_two.txt
或
perl -lne 'print unless ++$n{ $_ } ' file_one.txt file_two.txt
<强>输出强>
1
4
3
2
答案 3 :(得分:0)
自然的方式:
sort -u File1 File2 >Temp && mv Temp File1
如果文件已经排序,这是一个棘手的方法:
comm File1 File2 | awk '{$1=$1};1' >Temp && mv Temp File1