yae*_*ael 4 sed awk perl text-processing
我想从 中删除重复的行/etc/fstab
,所以我这样做了:
awk '!NF || !seen[$0]++' /etc/fstab > /etc/fstab.update
UUID=3de0d101-fba7-4d89-b038-58fe07295d96 /grid/sdb ext4 defaults,noatime 0 0
UUID=683ed0b3-51fe-4dc4-975e-d56c0bbaf0bc /grid/sdc ext4 defaults,noatime 0 0
UUID=1cf79946-0ba6-4cd8-baca-80c0a2693de1 /grid/sdd ext4 defaults,noatime 0 0
UUID=fa9cc6e8-4df8-4330-9144-ede46b94c49e /grid/sde ext4 defaults,noatime 0 0
UUID=3de0d101-fba7-4d89-b038-58fe07295d96 /grid/sdb ext4 defaults,noatime 0 0
UUID=683ed0b3-51fe-4dc4-975e-d56c0bbaf0bc /grid/sdc ext4 defaults,noatime 0 0
Run Code Online (Sandbox Code Playgroud)
但是我们可以看到,最后两行和前两行是一样的,只是最后两行有空格。
是否可以忽略空格并删除重复的行?
Qua*_*odo 13
强制重建记录$1=$1
!这将所有相邻的空间压缩为一个。
awk '{$1=$1};!seen[$0]++'
Run Code Online (Sandbox Code Playgroud)
用于tr
用空格替换制表符并挤压重复 ( -s
):
tr -s $'\t' ' ' < /etc/fstab | awk '!NF || !seen[$0]++' > /etc/fstab.update
Run Code Online (Sandbox Code Playgroud)
使用这个 Perl one-liner 将任意数量的空白视为单个空白:
perl -lane 'print unless $seen{"@F"}++' in.txt > out.txt
Run Code Online (Sandbox Code Playgroud)
如果要完全忽略空格,请使用:
perl -lane '$s = join "", @F; print unless $seen{$s}++' in.txt > out.txt
Run Code Online (Sandbox Code Playgroud)
Perl 单行使用这些命令行标志:
-e
: 告诉 Perl 查找内嵌代码,而不是在文件中。
-n
: 一次循环输入一行,$_
默认分配给它。
-l
:"\n"
在执行内联代码之前去除输入行分隔符(默认情况下在 *NIX 上),并在打印时附加它。
-a
:在空格或选项中指定的正则表达式上拆分$_
为数组。@F
-F
还请参见
perldoc perlrun
::如何执行 Perl 解释器:命令行开关
归档时间: |
|
查看次数: |
484 次 |
最近记录: |