일부 데이터가 포함된 테이블이 있는데 숫자(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
)을 제외하고 숫자로 끝나는 모든 열을 제거합니다.
하지만 실제로는 일이 너무 많습니다. 더 간단하다:
.
3행 끝의 마침표를 삭제 하고N
숫자열과A
문자열(제목 없음, 데이터)을 지정하는 nroff/groff 열 형식 섹션에 새로운 4행을 삽입하고,- Raku를 사용하여 헤더를 구문 분석하고(아래 예에서는
N A A N N A .
새 줄_#4로 사용) - 지정된 열을 삭제합니다
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
답변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