重複した行を削除したいので、/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
しかし、最後の2行は最初の2行と同じですが、最後の2行にスペースがあることがわかります。
スペースを無視して重複した行を削除できますか?
答え1
強制記録の再構成$1=$1
!これにより、隣接するすべてのスペースが1つのスペースに圧縮されます。
awk '{$1=$1};!seen[$0]++'
答え2
tr
タブをスペースに置き換えて繰り返しを押すには(-s
):
tr -s $'\t' ' ' < /etc/fstab | awk '!NF || !seen[$0]++' > /etc/fstab.update
答え3
このPerl 1行のスペースを使用して、複数のスペースを単一のスペースとして扱います。
perl -lane 'print unless $seen{"@F"}++' in.txt > out.txt
スペースを完全に無視するには、次のようにします。
perl -lane '$s = join "", @F; print unless $seen{$s}++' in.txt > out.txt
Perlシングルライナーは、次のコマンドラインフラグを使用します。
-e
:Perlにファイルではなくインラインコードを見つけるように指示します。
-n
:一度に1行ずつ入力を繰り返し、デフォルト$_
で割り当てられます。 :コードインラインを実行する前に、入力行区切り文字(* NIXのデフォルト)を削除して
-l
印刷するときに追加します。 :オプションで指定されたスペースまたは正規表現を使用して配列に分割します。"\n"
-a
$_
@F
-F