在Linux中合并两个文件且不重复的内容

6
我有两个文件file1和file2。
file1的内容是:
Hello
  how
are you
when can i meet you
film??

文件2的内容是:
Hello 
how 
are you
darling
when can i meet you

我想生成一个文件,它是两个文件的组合,就像这样。
Hello
how
are you
darling
when can i meet you
film??

注意:在最终文件中应忽略file1的第二行中的空格。是否有C或Linux内置函数来完成上述工作,或者是否可以编写脚本来完成此操作?

如果这样的函数存在,我肯定从未见过。你可能需要自己编写一个。 - WhozCraig
1
你可以使用fgets函数来读取行,并使用strcmp函数进行字符串比较。 - Oki Sallata
如果你不想在Linux下使用某些命令,你可以用C语言编写一个简单的程序来完成这个任务。 - Mihai8
3个回答

4

awk 简单易用:

$ awk '{$1=$1}!u[$0]++' file2 file1
Hello
how
are you
darling
when can i meet you
film??

如果您不关心输出顺序,可以使用以下代码:
$ sed 's/^\s*//' file1 file2 | sort -u 
are you
darling
film??
Hello
how
when can i meet you

"你是你吗?", "我能见到你吗?我能见到你吗?" - Kent
该死,join 几乎做到了,改为使用 awk 解决方案。 - Chris Seymour
你的awk命令是否真的输出了那个结果?我认为它会处理并打印出file1和file2的所有行,因此顺序没有保持。如果你给出参数file2 file1,那么它将给出那个输出。然而,如果输入文件稍微改变一下,顺序可能会出错。就我个人而言,当两个文件中的两行不同时,规则并没有被清楚地定义,因此很难给出一个精确的解决方案。 - Kent
你的回答 Your answer 有所改变。你是否看到了一些你喜欢的东西?当然,我是以最友好的方式说的。我解释了为什么 $1=$1 可能不是 OP 寻找的内容。请参见我的答案 - Steve
1
@steve 是的,我想太多了,我从某个地方得到了一个提示 ;) - Chris Seymour

1

您可以应用多个标准过滤器:

cat file1 file2 | perl -pe 's/^\s+//' | sort | uniq
  • cat 用于连接所有所需的文件,
  • perl 用于删除所有初始空格,
  • sort 对所有行进行排序,
  • uniq 则移除重复的行。

@Kent:在输出的行的顺序上似乎没有限制,但任务说明不够明确。 - anumi
@anumi 输出结果由 OP 指定。 - Chris Seymour
@sudo_O:嗯,“like”这个词引发了一些自由...无论如何,我同意我的解决方案不保持顺序。 - anumi
@sudo_O:我所提供的只是一个示例文件,我有很多行正在运行的文件,我需要做一些与上述非常相似的事情。 - Manu

1
这是一种使用 awk 的方法:
awk '{ gsub(/^[ \t]+|[ \t]+$/,"") } !a[$0]++' file2 file1

结果:

Hello
how
are you
darling
when can i meet you
film??

编辑:

问题出在:

awk '{ $1=$1 } !a[$0]++' file2 file1

虽然它在这个简单的例子中表现良好,但它会将类似的行视为相同的东西,因为它不仅会删除前导和尾随空格,还会删除字段之间的额外空格。例如,如果file1包含:

Hello
  how
are you
when  can i meet you
film??

两者都是:

when can i meet you

并且:

when  can i meet you

行将被视为同一件事。这可能是期望的结果,但根据您的问题,我认为最好按照第一个命令去除前导和尾随空格。希望对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接