특정 열 .csv에서 X가 포함된 행 삭제

특정 열 .csv에서 X가 포함된 행 삭제

현재 다음 방법을 사용하여 다음이 포함된 모든 이메일을 삭제합니다.EXAMPLE

sed -i '/EXAMPLE/d' newname.csv

EXAMPLE그러나 이렇게 하면 모든 열의 행이 삭제됩니다. EXAMPLE두 번째 열에 포함된 행만 삭제하고 싶습니다 . 열은 탭으로 구분됩니다. (아래 예)

pa**s-***c.com  support@n**.com George Ka*****os    Athens  Athens  1****   GREECE

탭 문제로 인해 시도한 다음 작업 중 아무 것도 작동하지 않았으므로 .txt를 덮어쓰고 열은 다음과 같습니다.

"pak**o.asia","jav***[email protected]","T**iq Ja**id","Rajan Pur","punjab","33***0","PAKISTAN"

답변1

grep -v '^[^\t]*\t[^\t]*EXAMPLE' <newname.csv >outfile

하지만 텍스트를 사용해야 할 수도 있습니다.<탭>거기에 있는 문자는 grep사용하는 문자에 따라 달라집니다.

아래도 마찬가지입니다 sed. 사용하면 -i특정 파일 시스템 보안 위험이 발생한다는 점에 유의하세요 .

sed -i '/^[^\t]*\t[^\t]*EXAMPLE/d' ./file

아니면 조금 더 까다로울 수도 있습니다.

sed -i 'h;s/\t/\n/2;/\t.*EXAMPLE.*\n/d;g' ./file

쉼표가 있는 데이터의 예:

sed -i '/^[^,]*,[^,]*EXAMPLE/d' ./file

전체 줄 삭제EXAMPLE첫 번째 쉼표 뒤와 다른 쉼표 앞에 발생합니다.

답변2

Perl을 사용하면 다음과 같이 쉽게 할 수 있습니다.

#!/usr/bin/perl;
use strict;
use warnings;

while (<>) {
    print unless ( split )[1] =~ m/EXAMPLE/;
}

이는 고정되지 않은 정규식이므로 대체해야 할 수도 있습니다 m/^EXAMPLE$/.

이는 간단히 다음과 같이 표현될 수 있습니다.

perl -ne 'print unless ( split )[1] =~ m/^EXAMPLE$/';

답변3

이러한 작업은 awkawk에 내부 파일 편집 기능이 없다는 점을 제외하면 실제로 사용하기 쉽고 이해하기 쉽습니다.

$ awk '$2 !~ /EXAMPLE/ {print $ALL}' old.csv > new.csv

관련 정보