如何仅将该数据复制到shell脚本/ bash中该文件中不存在的文件?

时间:2017-01-26 17:13:07

标签: bash shell

我必须将一些数据放在一个应该是唯一的文件中。 假设在 file1我有以下数据。

ABC
XYZ
PQR

现在我想添加MNO DES ABC然后它应该只复制“MNO”和“DES”,因为“ABC”已经存在。 file1应该看起来像

ABC
XYZ
PQR
MNO
DES

(ABC应该只有一次。)

4 个答案:

答案 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