Sed 또는 Awk(또는 기타)는 csv 파일에서 여러 열을 제거합니다.

Sed 또는 Awk(또는 기타)는 csv 파일에서 여러 열을 제거합니다.

함께 병합해야 하는 도구 공급업체의 파일이 여러 개 있습니다. 그러나 csv 파일의 일부 열만 사용됩니다. 그래서 관련없는 열을 제거하고 싶습니다. sed파일의 다른 형식을 지정했습니다. 처음 sed -i '1,4d4줄을 삭제하고, sed -i '/^\"/d'로 시작하는 모든 줄을 삭제하고 ", sed -i 's/ */ /g'여러 공백을 공백 하나로 바꾸고, 마지막으로 sed -i '\$d'마지막 줄을 삭제했습니다.

예를 들어:

2608577312,2608577312,"Metal drill bits HSS-PointTeq",AC,"Metal drill bits HSS-PointTeq","HSS PointTeQ 17,0 mm (reduced shank)",197,,102.78,,102.78,,102.78,,,,
06019H2100,06019H2100,"Drill Driver","BE ","Bosch Go","3.6V, 5/ 2.5 Nm, 360 rpm, inbuilt battery",1149,1,819.2869565217393,3,789.313043478261,10,759.3391304347826,,0,0,
06019K30K1,06019K30K1,"Drill Driver","BE ","GSR 185-LI (1 bat.)","18V, 1x 2.0Ah, 50/21 Nm, 35/10mm, brushless, Case",2399,1,1710.5913043478265,5,1648.0086956521743,20,1585.426086956522,,0,0,
06019K7020,06019K7020,"Drywall Screwdriver","BE ","GTB 185-LI","18V, 2x 2.0Ah, max. screw 6mm, brushless, reversible depth gauge, case",4699,1,3350.5913043478267,2,3228.0086956521745,4,3105.426086956522,,0,0,
06019G81K2,06019G81K2,"Impact Drill","BE ","GSB 120-LI + 23 pc acc","12V, 2x 2.0Ah, 30/14 Nm, drilling (wood/steel/masonry) 20/10/8mm, case",2049,1,1461.026086956522,4,1407.5739130434783,8,1354.121739130435,,0,0,
06019F83K6,06019F83K6,"Impact Drill","BE ","GSB 180-LI (1 bat.)","18V, 1x 2.0Ah, 54/21 Nm, drilling (wood/steel/masonry) 35/10/10mm, case",1799,1,1423.5565217391306,6,1376.626086956522,20,1314.0521739130436,,0,0,
06019F83K0,06019F83K0,"Impact Drill","BE ","GSB 180-LI","18V, 2x 2.0Ah, 54/21 Nm, drilling (wood/steel/masonry) 35/10/10mm, case",2799,1,1995.8086956521743,4,1922.7913043478263,10,1849.7739130434784,,0,0,
06019K31K1,06019K31K1,"Impact Drill","BE ","GSB 185-LI (1 bat.)","18V, 1x 2.0Ah, 50/21 Nm, drilling (wood/steel/masonry) 35/10/10mm, brushless, case",2599,1,1853.2,6,1785.4,12,1717.6,,0,0,
06019K31K2,06019K31K2,"Impact Drill","BE ","GSB 185-LI + 23 acc","18V, 2x 2.0Ah, 50/21 Nm, drilling (wood/steel/masonry) 35/10/10mm, brushless, acc., case",3399,1,2423.634782608696,5,2334.9652173913046,10,2246.295652173913,,0,0,
06019H5100,06019H5100,"Impact Drill","BE ","GSB 18V-50","18V, 2x 2.0Ah, 50/28 Nm, drilling (wood/steel/masonry) 35/13/13mm, brusless, case",3999,1,2851.4608695652178,6,2747.139130434783,12,2642.8173913043483,,0,0,
06019H5101,06019H5101,"Impact Drill","BE ","GSB 18V-50","18V, 2x 5.0Ah, 50/28 Nm, drilling (wood/steel/masonry) 35/13/13mm, brushless, L-Boxx",7199,1,5133.200000000001,3,4945.400000000001,6,4757.6,,0,0,
06019K6106,06019K6106,"Impact Drill","BE ","GSB 18V-90 C ","18V, 2x 5.0Ah, 64/36 Nm, drilling (wood/steel) 68/13mm, metal chuck, brushless, connectivity, L-Boxx",9399,1,6701.895652173914,3,6456.7043478260875,6,6211.513043478261,,0,0,
06019F0001,06019F0001,"Impact Driver","BE ","GDR 120-LI","12V, 2x 2.0Ah, 100 Nm, 1/4'' Internal hexagon, case",2499,1,1781.895652173913,3,1716.704347826087,6,1651.513043478261,,0,0,
06019G5223,06019G5223,"Impact Driver/Wrench","BE ","GDX 180-LI","18V, 2x 2.0Ah, 180 Nm, 1/4'' Internal Hexagon / 1/2'' Square, case",3999,1,2851.4608695652178,3,2747.139130434783,6,2642.8173913043483,,0,0,
06019G61K0,06019G61K0,"Impact Wrench","BE ","GDS 250-LI ","18V, 2x 4.0Ah, 250 Nm, 1/2'' Square, case",5599,1,3992.330434782609,2,3846.2695652173916,4,3700.208695652174,,0,0,
06019K0020,06019K0020,"Impact Wrench","BE ","GDS 18V-400","18V, 2x 5.0Ah, 400 Nm, 1/2'' Square, brushless, case",7699,1,5489.721739130436,3,5288.8782608695665,6,5088.034782608696,,0,0,
06019J8502,06019J8502,"Impact Wrench","BE ","GDS 18V-1050 H","18V, 2x 8.0Ah ProCore, 1,050 Nm, 3/4'' Square, biturbo, brushless, L-Boxx",13999,1,9981.895652173915,2,9616.704347826088,5,9251.51304347826,,0,0,
06119231K0,06119231K0,"Rotary Hammer","BE ","GBH 187-LI ","18V, 2x 5.0Ah, 2.4 J, drilling Ø (concrete/steel/wood) 24/13/30 mm, brushless, connectivity, case",10699,1,7628.852173913045,2,7349.7478260869575,3,7070.64347826087,,0,0,
061190600A,061190600A,"Rotary Hammer","BE ","GBH 36 V-LI Plus","36V, 2x 6.0Ah, Max drilling in concrete: 28 mm, SDS-Plus, 3.2 J, case",17699,1,12620.15652173913,2,12158.44347826087,3,11696.730434782608,,0,0,
06019H9021,06019H9021,"Angle Grinder","BE ","GWS 180-LI ","18V, 2x 4.0Ah, 11000 rpm, 125mm, M14, brushless, case",5799,1,4134.939130434783,3,3983.6608695652176,6,3832.3826086956524,,0,0,
06016B0072,06016B0072,Router,"BE ","GKF 12V-8 (solo)","12V, 13 000 rpm, includes a 1/4"" collet",2999,1,2138.4173913043483,2,2060.1826086956526,4,1981.9478260869566,,0,0,
06014A1100,06014A1100,Light,"BE ","GLI 18V-300","18V, LED, 300 lumen, 300 min/Ah",749,1,534.0695652173914,3,514.5304347826087,6,494.99130434782614,,0,0,
0601446400,0601446400,Light,"BE ","GLI 18V-1900 ","18V, LED, 1,900 lumen, 100 min/Ah ",1899,1,1354.0695652173915,2,1304.5304347826088,5,1254.9913043478261,,0,0,
06019F5100,06019F5100,Blower,"BE ","GBL 18V-120","18V, 17000 rpm , 120 m³/h",1149,1,819.2869565217393,3,789.313043478261,5,759.3391304347826,,0,0,
06019D0200,06019D0200,"Orbital Sander ","BE ","GSS 18V-10","18V, sanding sheet, width 115mm, 22 000 opm",1499,1,1068.8521739130435,3,1029.7478260869566,5,990.6434782608696,,0,0,
06019C6200,06019C6200,"Vacuum Cleaner","BE ","GAS 18V-1","18V, 0.7l container volume, 10 l/s",1499,1,1068.8521739130435,3,1029.7478260869566,5,990.6434782608696,,0,0,
06019H9022,06019H9022,"Angle Grinder","BE ","GWS 180-LI","18V, 115 mm, 11000 rpm, M14, brushless",1799,1,1298.408695652174,6,1259.3000000000002,20,1220.1913043478262,,0,0,
06019K3183,06019K3183,"Impact Drill","BE ","GSB 185-LI ","18V, 50/21 Nm, drilling (wood/steel/masonry) 35/10/10mm, brushless, case",1799,1,1282.7652173913045,3,1235.8347826086958,5,1188.9043478260871,,0,0,
06019G5226,06019G5226,"Impact Driver/Wrench","BE ","GDX 180-LI","18V,180 Nm, 1/4'' Internal hexagon / 1/2'' Square holder",2199,1,1567.9826086956525,3,1510.617391304348,5,1453.2521739130436,,0,0,
06013A5020,06013A5020,"Random Orbital Sander","BE ","GEX 185-LI ","18V, sanding pad dia. 125mm, Orbit dia. 2.5mm, brushless",2199,1,1567.9826086956525,3,1510.617391304348,6,1453.2521739130436,,0,0,
06119111K0,06119111K0,"Rotary Hammer","BE ","GBH 180-LI","18V, Max drilling in concrete: 20 mm, SDS-Plus, 2 J, brushless",2699,1,1947.9739130434782,4,1889.3,10,1830.626086956522,,0,0,
06019K7021,06019K7021,"Drywall Screwdriver","BE ","GTB 185-LI ","18V, max. screw 6mm, reversible depth gauge, brushless, case",2999,1,2138.4173913043483,3,2060.1826086956526,6,1981.9478260869566,,0,0,
06019K0021,06019K0021,"Impact Wrench","BE ","GDS 18V-400","18V, 400 Nm, 1/2'' Square, brushless",2999,1,2138.4173913043483,3,2060.1826086956526,6,1981.9478260869566,,0,0,
06015B3021,06015B3021,"Jig Saw","BE ","GST 185-LI","18V, cutting depth in wood: 125 mm, brushless, LED",2999,1,2138.4173913043483,3,2060.1826086956526,6,1981.9478260869566,,0,0,
06016A2200,06016A2200,"Circular Saw","BE ","GKS 18V-57","18V, cutting depth: 57/39mm, saw blade dia.: 165mm",2999,1,2138.4173913043483,3,2060.1826086956526,6,1981.9478260869566,,0,0,

위 행에는 17개의 열이 있습니다. 1,5,9열을 어떻게 삭제하나요?

편집: 더 큰 샘플 크기를 추가했습니다. 예, 열은 항상 일관됩니다.

답변1

CSV 데이터에는 쉼표가 포함된 필드가 있으므로 단순한 쉼표 분할이 아닌 올바른 CSV 파서를 사용해야 합니다. 또한 데이터에는 멀티바이트(utf8?) 문자가 포함되어 있으므로 이를 처리할 수 있는 무언가를 사용해야 합니다.

펄과밀러좋은 선택입니다. CSV를 인쇄하거나 SQL 데이터베이스로 가져오기 전에 CSV 파일에 대해 추가 처리가 필요한 경우(각 행이 배열 $row참조에 있으면 원하는 대로 무엇이든 할 수 있습니다. 귀하의 경우에는 Perl을 사용합니다) Perl 스크립트 여러 소스 파일을 병합하거나, 중복된 항목을 제거하거나, 인치 ''대신 사용하는 등 이상한 형식의 콘텐츠를 정리할 수 있으며 , 필요한 경우 일부 필드를 잘라내는 것뿐입니다."miller

사용밀러:

$ mlr --csv --hi --ho cut -x -f 1,5,9  input.csv 

Perl과 Perl의 사용텍스트::CSV기준 치수:

$ perl -MText::CSV -CSDA -e '
    my $file=shift;
    my $csv=Text::CSV->new();
    open(my $fh, "<", $file) or die "error opening $file:$!\n";
    while(my $row = $csv->getline($fh)) {
      foreach my $i (8,4,0) {splice @$row, $i, 1};
      $csv->say(STDOUT, $row)
    }' input.csv

splice참고: Perl 배열은 1이 아닌 0에서 시작합니다. 요소 제거 시 인덱스 번호 다시 매기기 문제를 피하기 위해 Perl 함수를 사용하여 배열 요소를 역순으로 제거했습니다 .

또한 참고: 이는 Perl에 포함되어 있지 않으며 배포판(예: Debian 및 Ubuntu 및 Mint와 같은 파생 제품) Text::CSV에서 패키지하거나 .apt-get install libtext-csv-perlcpan

답변2

당신은 GNU sed(for)를 사용하고 있으므로 -iGNU awk도 가지고 있다고 가정합니다. awk를 사용할 때 sed가 필요하지 않기 때문에 모든 sed 명령을 제거할 수 있습니다. 이 1 awk 스크립트를 실행하기만 하면 됩니다.마그네틱 RE질문에서):

awk -v FPAT='([^,]*)|("([^"]|"")*")' -v OFS=',' '
    (NR > 5) && (prev !~ /^"/) {
        gsub(/ +/," ",prev)
        nf = patsplit(prev,p)
        out = sep = ""
        for ( i=1; i<=nf; i++ ) {
            if ( i !~ /^[159]$/ ) {
                out = out sep p[i]
                sep = OFS
            }
        }
        print out
    }
    { prev = $0 }
' file

예를 들어 1, 5, 17, 35열을 삭제하려면 원하는 경우 또는 로 i !~ /^[159]$/변경 하면 됩니다 .i !~ /^([15]|17|35)$/i !~ /^(1|5|17|35)$/

스크립트에서 하드코딩하는 대신 건너뛸 필드 목록을 전달할 수 있게 하려면 위의 내용을 다음과 같이 변경하세요.

awk -v skip='1,5,9' -v FPAT='([^,]*)|("([^"]|"")*")' -v OFS=',' '
    BEGIN {
        patsplit(skip,tmp)
        for ( i in tmp ) {
            skipFlds[tmp[i]]
        }
    }
    (NR > 5) && (prev !~ /^"/) {
        gsub(/ +/," ",prev)
        nf = patsplit(prev,p)
        out = sep = ""
        for ( i=1; i<=nf; i++ ) {
            if ( !(i in skipFlds) ) {
                out = out sep p[i]
                sep = OFS
            }
        }
        print out
    }
    { prev = $0 }
' file

테스트를 마치고 결과에 만족하면 입력 파일을 업데이트 awk하도록 변경합니다(예: ).awk -i inplacesed -i

위의 경우 및 를 처리하려면 GNU awk가 FPAT필요 patsplit()합니다 -i inplace.

바라보다awk를 사용하여 csv를 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까CSV를 구문 분석하기 위해 awk를 사용하는 방법에 대한 추가 정보.

답변3

sed1, 5, 9열을 삭제 하는 데 사용됩니다 .

$ sed -E 's/^[^,]*,(([^,]*,){3})[^,]*,(([^,]*,){3})[^,]*,/\1\3/' input_file
2608577312,"Metal drill bits HSS-PointTeq",AC,"HSS PointTeQ 17,0 mm (reduced shank)",197,102.78,,102.78,,102.78,,,,

sed모든 명령을 하나의 명령으로 연결할 수 있습니다 .

$ sed -Ei.bak '1,4d;$d;/^"/d;s/ +/ /g;s/^[^,]*,(([^,]*,){3})[^,]*,(([^,]*,){3})[^,]*,/\1\3/' input_file

답변4

선택한 열만 필요하므로 awk또 다른 좋은 옵션일 수 있습니다 . 원하는 열만 선택하는 방법은 다음과 같습니다.

데이터:

os_user:~$ cat csv_file.csv 
Tom,Jerry,23,US
luca,brasi,55,UK

필드 구분 기호 및 인쇄 기능을 사용하여 필수 열을 선택합니다.

os_user:~$ awk -F"," '{print $1","$3}' csv_file.csv 
Tom,23
luca,55

인덱스는 awk1부터 시작합니다. 위 데모에서는 열 1과 3이 인쇄되었습니다. 또한 조건부 행 삭제, 데이터 처리 등을 위해 더욱 복잡한 프로그래밍을 수행할 수 있습니다.

자세한 내용은 다음을 참조하세요. AWK 참조

편집자 주: 질문에 언급되지 않았지만 일부 열에 쉼표가 있다는 것을 몰랐습니다. 의견을 주신 Ed Morton에게 감사드립니다. 올바르게 처리되어야 하는데 위의 솔루션에서는 이를 고려하지 않습니다.

관련 정보