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 合并两个几乎相似的文本文件_Shell_Unix_Merge - Fatal编程技术网

Shell 合并两个几乎相似的文本文件

Shell 合并两个几乎相似的文本文件,shell,unix,merge,Shell,Unix,Merge,假设我们有~/file1: line1 line2 line3 …和~/file2: line1 lineNEW line3 请注意,这两个文件几乎相同,只是line2与lineNEW不同 问题:如何合并这两个文件以生成一个如下所示的文件: line1 line2 lineNEW line3 也就是说,如何合并这两个文件,以便将所有唯一的行(无重叠)捕获到第三个文件中?请注意,行的顺序并不重要(只要捕获所有唯一的行即可)。awk'{ 打印 getline行

假设我们有
~/file1

line1
line2
line3
…和
~/file2

line1
lineNEW
line3
请注意,这两个文件几乎相同,只是
line2
lineNEW
不同

问题:如何合并这两个文件以生成一个如下所示的文件:

line1
line2
lineNEW
line3
也就是说,如何合并这两个文件,以便将所有唯一的行(无重叠)捕获到第三个文件中?请注意,行的顺序并不重要(只要捕获所有唯一的行即可)。

awk'{
打印
getline行<秒
如果($0!=行)打印行
}'second=file2 file1

将执行以下命令。它更健壮,因为它也适用于添加了新行而不是替换了新行的文件(请参见下面的f1和f2)

首先,我用你的文件执行了它。我将命令分为两行,以便很好地符合“代码块”:

它将生成您的预期输出:

line1
line2
lineNEW
line3
我还使用了这两个额外的文件来测试它:

f1:

f2:

命令如下:

$ (awk '{ print NR, $0 }' f1; awk '{ print NR, $0 }' f2) |\
sort -k 2 | uniq -f 1 | sort | cut -d " " -f 2-
它产生以下输出:

line1   stuff after a tab
line2 line2
lineNEW
line3
line4
line5
line6

如果您不关心订单,只需对其进行排序:

cat ~/file1 ~/file2 | sort -u > ~/file3

难道你不能基于
diff
创建一个补丁文件,然后在应用它之前简单地删除其中的删除行吗?如果你实际运行的是bash或另一个支持从文件描述符读取的shell,那么在标记为“shell”时,您可以将第二个文件重定向到单独的描述符,然后简单地逐行比较内容。e、 g.
读取时,线性a;do read-r-u 3行B;[“$a”=“$b”]。。。;doneawk'1;{getline Lor
paste file1 file2 | awk-F'\t'{print$1;如果($1!=$2)print$2}'
Glenn,这是一个∞% 对问题代码的改进。通过提供答案而不是否决或关闭答案来鼓励不好的问题是否司空见惯?我不知道。我希望人们从我的答案中学习。我喜欢解决这些难题的挑战。有时我喜欢炫耀;)如果第二个文件的第2行与第一个文件的第3行。根据问题,似乎只有相同位置的相同行应为“uniq”ed.@ghoti,如果相同位置的相同行应为“uniq”ed,你是对的;这个解决方案不起作用。但是,我不能完全确定这是被问到的问题。问题的最后一句话让我怀疑:“请注意,行的顺序并不重要(只要捕获所有唯一的行)。”也许他只是指同一位置的两行不同的顺序,但我不确定。使用“合并”这个词让我想同意你的看法。另一件让我怀疑的事情是,如果只有同一位置的行应该是“uniq”ed,那么添加一行将从此处中断合并。
line1   stuff after a tab
lineNEW
line2 line2
line3
line4
line5
line6
$ (awk '{ print NR, $0 }' f1; awk '{ print NR, $0 }' f2) |\
sort -k 2 | uniq -f 1 | sort | cut -d " " -f 2-
line1   stuff after a tab
line2 line2
lineNEW
line3
line4
line5
line6
cat ~/file1 ~/file2 | sort -u > ~/file3