중복된 행을 제거하고 싶어서 /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
하지만 마지막 두 줄은 처음 두 줄과 동일하지만 마지막 두 줄에 공백이 있음을 알 수 있습니다.
공백을 무시하고 중복된 줄을 제거할 수 있나요?
답변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 한 줄짜리 공백을 사용하여 여러 공백을 단일 공백으로 처리하십시오.
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
: 한 번에 한 줄씩 입력을 반복하며 $_
기본적으로 할당됩니다. : 코드 인라인을 실행하기 전에 입력 줄 구분 기호(*NIX의 기본값)를 제거
-l
하고 인쇄할 때 추가합니다. : 옵션에 지정된 공백이나 정규식을 사용하여 배열로 분할합니다."\n"
-a
$_
@F
-F