대용량 파일에서 열을 추출하여 새 파일에 붙여넣어 데이터 파일을 준비하려고 합니다.
해당 데이터의 열 수가 매우 많습니다. 데이터를 분할하여 여러 개의 데이터 파일을 준비하고 싶습니다.
아래 스크립트를 시도하고 있지만 작동하지 않습니다. 복사할 열 범위를 지정하면 오류가 발생할 것으로 예상했습니다.
#!/bin/bash
paste <(awk '{print $1,$2,$3,...$19,$20}' Precipitation.csv ) > aaaaa1
paste <(awk '{print $21,$22,$23,...$39,$40}' Precipitation.csv ) > aaaaa2
paste <(awk '{print $41,$42,$43,...$99,$100}' Precipitation.csv ) > aaaaa3
코드를 수정하는 데 도움을 주실 수 있나요?
답변1
이거 케이스 같은데cut
다음보다 더 잘할 것입니다 awk
:
cut -d , -f1-20 Precipitation.csv > aaa1
cut -d , -f21-40 Precipitation.csv > aaa2
cut -d , -f41-100 Precipitation.csv > aaa3
-d ,
구분 기호(쉼표, 입력을 CSV라고 부르지만 변경할 수 있음)를 지정합니다. 포함하여 -f N-M
출력에 표시할 필드를 선택합니다 . 필드에 쉼표가 포함되어 있으면 손상될 수 있습니다. 이 경우 실제 CSV 파서가 필요할 수 있지만 실제로 불가능할 경우 무언가를 함께 던질 수 있습니다.N
M
출력은 입력과 동일한 구분 기호를 사용합니다. GNU cut
지원--output-delimiter=STRING
다른 구분 기호를 설정할 수 있는 옵션이 있지만 다른 사람은 그렇게 하지 않을 것 같습니다. FreeBSD에는 cut
다음이 포함됩니다-w
공백으로 분할 옵션이 awk
기본값에 더 가깝습니다. 이러한 동작 중 하나를 다른 곳에서 구현하려면 구분 기호 앞/뒤를 변환하는 것이 아마도 최선의 선택일 것입니다.
답변2
후속 조치마이클 호머의 답변:
ksh
zsh
프로세스 대체( , , )를 지원하는 셸을 사용하여 파일을 여러 번 읽는 것을 방지하려면 다음 을 수행하세요 bash
.
tee < Precipitation.csv >(cut -d, -f1-20 > aaa1) >(cut -d, -f21-40 > aaa2) |
cut -d, -f41- > aaa3
답변3
그리고 perl
:
perl -F',' -anle 'print join ",", @F[0..19]' Precipitation.csv > aaa1
perl -F',' -anle 'print join ",", @F[20..39]' Precipitation.csv > aaa2
perl -F',' -anle 'print join ",", @F[40..99]' Precipitation.csv > aaa3
답변4
입력 파일을 한 번만 읽으므로 더 나은 성능을 제공합니다.
awk '{out1=$1; for(i=2; i<=20; i++) {out1 = (out1 FS $i)}
out2=$21; for(i=22; i<=40; i++) {out2=(out2 FS $i)}
out3=$41; for(i=42; i<=100; i++) {out3=(out3 FS $i)}
print out1 > "aaaaa1"; print out2 > "aaaaa2"; print out3 > "aaaaa3"}' Precipitation.csv
또는 다음 명령에 모든 필드 번호를 입력할 수 있습니다. "..."를 모든 필수 필드 번호로 바꾸십시오.
awk '{print $1,$2,$3,...$19,$20 > "aaaaa1";
print $21,$22,$23,...$39,$40 > "aaaaa2";
print $41,$42,$43,...$99,$100 > "aaaaa3"}' Precipitation.csv