在linux中合​​并两个文件而不重复

时间:2013-01-09 10:51:21

标签: c linux shell awk

我有两个文件file1和file2

file1的内容是

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

file2的内容是

Hello 
how 
are you
darling
when can i meet you

我想生成一个文件,它是两个文件的组合,如

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

行将被视为同一件事。这可能是期望的结果,但根据您的问题,我认为最好根据第一个命令简单地去除前导和滞后空白。 HTH。

答案 2 :(得分:0)

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

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