使用 sed 将一个文件的内容复制到另一个文件

Abd*_*lah 1 sed text-processing

我想在 Alma Linux 8 上使用 sed 将一个文件中的所有文本复制到另一个文件中。例如,第一个文件old.txt是:

192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5 
...
Run Code Online (Sandbox Code Playgroud)

另一个文件new.txt是:

192.168.0.1
192.168.0.2
192.168.0.3
Run Code Online (Sandbox Code Playgroud)

我想将条目复制old.txtnew.txt但不重复。预期产出new.txt

192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

roa*_*ima 10

除了具有唯一性约束的简单排序之外不需要任何东西。

sort -u old.txt new.txt >new.txt.tmp &&
     mv -f new.txt.tmp new.txt
rm -f new.txt.tmp
Run Code Online (Sandbox Code Playgroud)

我看到POSIX确实定义了直接写入输入文件sort的能力,所以你也可以这样做,但我还没有测试过它在发生故障时的鲁棒性(以前的版本保证要么保留原装或更换新的,不会造成损失):

sort -o new.txt -u old.txt new.txt
Run Code Online (Sandbox Code Playgroud)

或者你可以使用awk. 此版本保持文件中行的顺序不变,从第一个文件开始,仅添加后续文件中的新行:

awk '
    FNR<NR && h[$0] { next }    # Skip seen lines in secondary files
    { h[$0]=1; print }          # Record the line and output it
' new.txt old.txt
Run Code Online (Sandbox Code Playgroud)

我已将其分成几行,以便我可以添加评论。删除它们,您可能会将其崩溃为一行,但通常最好编写可读的代码。它故意不删除第一个文件new.txt. 如果你想要那个,

awk '! h[$0]++' new.txt old.txt
Run Code Online (Sandbox Code Playgroud)

这会增加所看到的每一行的关联数组值,但仅当该值为零(未设置)时才打印它。