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.txt
到new.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)
这会增加所看到的每一行的关联数组值,但仅当该值为零(未设置)时才打印它。