숫자만 포함된 열 제거

숫자만 포함된 열 제거

일부 데이터가 포함된 테이블이 있는데 숫자(Nr., Cod, Tiraj)만 포함된 열을 삭제해야 합니다.

Nr.     Autor         Titlu        Cod     Tiraj     Tara
1    Gauss Carl   Aritmetica 1   297485   11454   Germania
2    Gauss Carl   Aritmatica 2   297484   10254   Germania
3    Gauss Carl   Aritmetica 3   297455   45872   Germania

결과는 다음과 같아야 합니다.

Autor         Titlu         Tara
Gauss Carl   Aritmetica 1   Germania
Gauss Carl   Aritmatica 2   Germania
Gauss Carl   Aritmetica 3   Germania

열 사이TAB

나는 이것을 사용하여 테이블을 만들었습니다.

.TS
tab(@);
c c c c c c .
Nr.@Autor@Titlu@Cod@Tiraj@Tara
1@Gauss Carl@Aritmetica 1@297485@11454@Germania
2@Gauss Carl@Aritmatica 2@297484@10254@Germania
3@Gauss Carl@Aritmetica 3@297455@45872@Germania
.TE

답변1

일부 정크 행이 있고 필드 구분 기호로 사용되는 CSV 데이터 세트에서 NR.Cod열을 제거하려고 합니다.Tiraj@

sed -e 1,3d -e '$d' file |
csvcut -d @ -C 'Nr.,Cod,Tiraj' |
csvformat -D @

그 출력은 다음과 같습니다

Autor@Titlu@Tara
Gauss Carl@Aritmetica 1@Germania
Gauss Carl@Aritmatica 2@Germania
Gauss Carl@Aritmetica 3@Germania

제거된 내용을 다시 추가 sed하고 새 열 수에 맞게 조정한 다음 새 파일에 씁니다.

{
    printf '%s\n' .TS 'tab(@);' 'l l l .'
    sed -e 1,3d -e '$d' file |
    csvcut -d @ -C 'Nr.,Cod,Tiraj' |
    csvformat -D @
    echo .TE
} >file.new

csvcut유틸리티는 csvformat다음에서 제공되는 CSV 파일 처리용 툴킷인 csvkit의 일부입니다.https://csvkit.readthedocs.io/en/latest/

최종 테이블은 nroff -t file.new.

초기 파이프라인의 출력을 실행하여 테이블의 변형을 얻을 수도 있습니다 column -s @ -t.

$ sed -e 1,3d -e '$d' file | csvcut -d @ -C 'Nr.,Cod,Tiraj' | csvformat -D @ | column -s @ -t
Autor       Titlu         Tara
Gauss Carl  Aritmetica 1  Germania
Gauss Carl  Aritmatica 2  Germania
Gauss Carl  Aritmetica 3  Germania

또는 다음을 사용할 수 있습니다 csvlook.

$ sed -e 1,3d -e '$d' file | csvcut -d @ -C 'Nr.,Cod,Tiraj' | csvlook
| Autor      | Titlu        | Tara     |
| ---------- | ------------ | -------- |
| Gauss Carl | Aritmetica 1 | Germania |
| Gauss Carl | Aritmatica 2 | Germania |
| Gauss Carl | Aritmetica 3 | Germania |

...당신이 어떤 사람인지에 따라 달라요실제로출력으로 원합니다.

답변2

이 투박한 개념 증명을 시도해 보세요. 이는 열이 항상 숫자이거나 숫자가 아니라는 가정을 기반으로 합니다.

awk -F"\t" '
NR==1   {split($0, HDRSV)                                       # save header fields for later use
         next
        }
NR==2   {for (i=1; i<=NF; i++)  if ($i+0 != $i) PR[++IX] = i    # check if column is non-numeric and
                                                                # save col nr for print
         for (i=1; i<=IX; i++) printf "%s\t", HDRSV[PR[i]]      # print header fields
         printf ORS                                             # and line terminator
        }
        {for (i=1; i<=IX; i++) printf "%s\t", $PR[i]            # print each line´s fields
         printf ORS                                             # and line terminator
        }
' file
Autor   Titlu   Tara    
Gauss Carl  Aritmetica1 Germania    
Gauss Carl  Aritmatica2 Germania    
Gauss Carl  Aritmetica3 Germania    

답변3

사용행복하다(이전 Perl_6)

~$ cat authors.tr | raku -ne '.split( / [^ | \S] [\d+]+ %% "\@" /, :skip-empty).join("\@").put;' | raku -ne '++$ == 4 ?? .split("\@")[1,2,5].join("\@").put !! .put;' | nroff -t -Tascii

입력 예:

TS
tab(@);
c c c c c c .
Nr.@Autor@Titlu@Cod@Tiraj@Tara
1@Gauss Carl@Aritmetica 1@297485@11454@Germania
2@Gauss Carl@Aritmatica 2@297484@10254@Germania
3@Gauss Carl@Aritmetica 3@297455@45872@Germania
.TE

예제 출력:

  Autor         Titlu         Tara
Gauss Carl   Aritmetica 1   Germania
Gauss Carl   Aritmatica 2   Germania
Gauss Carl   Aritmetica 3   Germania

authors.tr도전으로, 나는 nroff/groff 소스 파일을 수정하는 Raku 한 줄짜리 코드(두 줄의 코드: 헤더용과 데이터 열용)를 작성해 보기로 결정했습니다 . 한 가지 까다로운 측면은 전체 필드가 ​​숫자로만 구성되어 있는지 확인하기 어렵다는 것입니다. 내부(가장 왼쪽이 아닌/가장 오른쪽이 아닌) 열은 확실히 열 구분 기호로 둘러싸여 있지만 터미널(가장 왼쪽/가장 오른쪽)은 그렇지 않습니다.

나는 결국 (적어도 특정 열에 대해) 첫 번째 정규식 원자가 이어야 한다는 사실을 발견했습니다 [^ | \S]. 정규식의 나머지 부분은 %%반복되는(열별) 패턴을 인식하는 Raku의 멋진 "수정 수량자"에 의해 처리 [\d+]+ %% "\t"됩니다 .'하나 이상의 열 - \d+탭으로 구분, 후행 탭 허용'. 위 정규식은 앞에 공백이 포함된 열(예: columns Aritmetica 1)을 제외하고 숫자로 끝나는 모든 열을 제거합니다.

하지만 실제로는 일이 너무 많습니다. 더 간단하다:

  1. .3행 끝의 마침표를 삭제 하고 N숫자열과 A문자열(제목 없음, 데이터)을 지정하는 nroff/groff 열 형식 섹션에 새로운 4행을 삽입하고,
  2. Raku를 사용하여 헤더를 구문 분석하고(아래 예에서는 N A A N N A . 새 줄_#4로 사용)
  3. 지정된 열을 삭제합니다 N.
~$ cat authors2.tr  |  raku -e 'my @a=lines; \
    @a[2..3] = @a[2..3]>>.comb>>.[0,2,4...*];    \
    @a[4..7].=map: *.split("\@", :skip-empty);   \
    my $n    = @a[3].grep({!/ N /}, :k ).list;   \
    @a[2]    = @a[2][ |$n.head(*-1)];  @a[3] = @a[3][ |$n];  \
    @a[4..7].=map: *.[ |$n.head(*-1)].join("\@");  .put for @a;' 

출력 예(유효한 nroff/groff):

.TS
tab(@);
c c c
A A A .
Autor@Titlu@Tara
Gauss Carl@Aritmetica 1@Germania
Gauss Carl@Aritmatica 2@Germania
Gauss Carl@Aritmetica 3@Germania
.TE

출력 예( 이후 nroff -t -Tascii):

  Autor         Titlu         Tara
Gauss Carl   Aritmetica 1   Germania
Gauss Carl   Aritmatica 2   Germania
Gauss Carl   Aritmetica 3   Germania

https://raku.org

답변4

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
    if ( NR > 1 ) {
        for ( i=1; i<=NF; i++ ) {
            if ( $i != ($i+0) ) {
                isGood[i]
            }
        }
    }
    next
}
{
    out = sep = ""
    for ( i=1; i<=NF; i++ ) {
        if ( i in isGood ) {
            out = out sep $i
            sep = OFS
        }
    }
    print out
}

$ awk -f tst.awk file file
Autor   Titlu   Tara
Gauss Carl      Aritmetica 1    Germania
Gauss Carl      Aritmatica 2    Germania
Gauss Carl      Aritmetica 3    Germania

관련 정보