Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在shell脚本/bash中仅将该数据复制到该文件中不存在的文件中?_Bash_Shell - Fatal编程技术网

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

如何在shell脚本/bash中仅将该数据复制到该文件中不存在的文件中?,bash,shell,Bash,Shell,我必须把一些数据放在一个应该是唯一的文件中。 假设 文件1我有以下数据 ABC XYZ PQR 现在我想添加MNO DES ABC那么它应该只复制“MNO”和“DES”,因为“ABC”已经存在。 文件1应该看起来像 ABC XYZ PQR MNO DES (ABC只能在那里呆一次。)使用fgrep: fgrep -vf file1 file2 > file2.tmp && cat file2.tmp >> file1 && rm file2.

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

ABC
XYZ
PQR
现在我想添加
MNO DES ABC
那么它应该只复制“MNO”和“DES”,因为“ABC”已经存在。 文件1应该看起来像

ABC
XYZ
PQR
MNO
DES

(ABC只能在那里呆一次。)

使用
fgrep

fgrep -vf file1 file2 > file2.tmp && cat file2.tmp >> file1 && rm file2.tmp
它获取
file2
中不在
file1
中的所有行,并将结果附加到
file1


您可能想看看这篇文章:

Perl一行程序

文件一:
1
2
三,

文件二:
1
4
三,

仅打印唯一行
perl-lne'print if++$n{$\u}==1'文件\u one.txt文件\u two.txt

perl-lne'除非打印+++$n{$}文件\u one.txt文件\u two.txt

输出
1
4
3

2

最简单的方法:此选项不允许在
f1

diff -c f1 f2|grep ^+|awk -F '+ ' '{print $NF}' >> f1
或者如果“+”将成为实际文本的一部分:

脚本后输出*

$ ./compareCopy f1 f2
-----------------------------------------------------
 comparing f1 f2
-----------------------------------------------------
Lines check - DONE
$ cat f1
ABC
XYZ
PQR
DES
MNO  

#/垃圾箱/垃圾箱
如果[$#!=“2”];然后
回声
echo“需要来自命令提示符的参数”
echo“用法:比较”
回声
出口
fi
proc=“compareCopy”
#按行比较对文件进行排序
cat$1 | sort>file1.tmp
cat$2 | sort>file2.tmp
回声“--------------------------------------------------------------”
echo“comparing$1$2”| tee${proc}\u compare.result
回声“--------------------------------------------------------------”
file1_line=`wc-l$1 | cut-d”“-f1`
file2_line=`wc-l$2 | cut-d”“-f1`
#检查每一行
x=1
而[“${x}”-le“${file1_lines}”]
做
f1_line=`sed-n${x}p file1.tmp`
f2_line=`sed-n${x}p file2.tmp`
如果[“${f1_线}”!=“${f2_线}”];然后
echo“行号${x}在$1和$2文件中都不匹配”>>${proc}\u compare.result
echo“$1行:${f1_line}”“>>${proc}\u compare.result
echo“$2行:${f2_line}”“>>${proc}\u compare.result
#所以在文件1中添加这一行
回显$f2_行>>$1
fi
x=$[${x}+1]
完成
rm-f file1.tmp file2.tmp
echo“Lines check-DONE”| tee-a${proc}\u compare.result
自然方式:

sort -u File1 File2 >Temp && mv Temp File1
如果文件已排序,则需要技巧:

comm File1 File2 | awk '{$1=$1};1' >Temp && mv Temp File1

您想如何检查“如果它不在目标文件中”,您是指逐行比较吗?它们是已排序的文件吗?可以对它们进行排序吗?你能给出两个输入文件和预期输出的示例吗?如果文件可以进行排序,可以吗?@AkshayB-查看更新的答案-你可以一步完成确定谢谢,假设我想复制一些文本,比如“abc”对于一个没有复制的文件,我应该使用什么???@codeforester-应该是
fgrep-f file2 file1
对于大文件来说似乎效率很低。
#!/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
sort -u File1 File2 >Temp && mv Temp File1
comm File1 File2 | awk '{$1=$1};1' >Temp && mv Temp File1