특정 디렉터리에 많은 수의 CSV 파일이 있습니다. 모두 일치하는 헤더가 있는 최소 41개의 열이 있지만 너비는 최대 200개까지 가능합니다. 처음 40개 열을 가져와서 추가하여 헤더가 있는 CSV를 생성하면 됩니다. 나는 이것에 비교적 익숙하지 않으며 이 예를 따르려고 노력하고 있습니다.bash를 사용하여 디렉토리에 모든 csv 파일의 처음 200개 행을 유지하는 방법은 무엇입니까?그것과 결합여러 .csv 파일의 내용을 단일 .csv 파일로 병합. 한 줄로 제한하려고 하는데 가능할까요? "cut"과 "cat" 명령의 조합이 필요할 것 같습니다. 나는 다음과 같은 것을 성공적으로 실행하지 않고 시도했습니다.
$ for file in *.csv do cut -d ',' -f1-40 "$file" > "$file"; done
그 다음에
cat *csv > combined.csv
전혀 행운이 없습니다.
어떤 조언이라도 대단히 감사하겠습니다. 감사해요.
답변1
모든 파일을 덮어쓰고 나중에 연결하는 대신 cut
모든 파일을 잘라내어 결과를 직접 출력하십시오 combined.csv
.
목록 자체에 해당 항목이 포함되어 있지 않은지 확인해야 합니다 combined.csv
. 그렇지 않으면 파일 시스템을 가득 채우는 무한 루프가 발생할 수 있습니다.
(rm -f combined.csv && set ./*.csv && cut -d, -f1-40 "$@" > combined.csv)
또는 (GNU xargs
또는 호환 가능하다고 가정):
(
rm -f combined.csv &&
set ./*.csv &&
printf '%s\0' "$@" |
xargs -r0 cut -d, -f1-40 > combined.csv
)
파일 목록이 csv
너무 크면"매개변수 목록이 너무 깁니다"실수.
첫 번째 파일을 제외한 모든 파일에서 헤더를 제거하려면 루프가 필요하지만, 그래도 각 파일을 내부에서 편집하고 나중에 연결하는 것보다 루프의 출력을 리디렉션하는 것이 좋습니다.
(
rm -f combined.csv && set ./*.csv &&
{
cut -d, -f1-40 < "$1"
shift
for file do
tail -n+2 < "$file" | cut -d, -f1-40
done
} > combined.csv
)
어쨌든 tail
및 cut
유사 항목을 사용하면 csv 셀에 개행 문자 ,
나 개행 문자가 포함되어 있지 않다고 가정합니다. 임의의 콘텐츠가 포함된 CSV를 처리하려면 mlr
OR 과 같은 적절한 CSV 조작 유틸리티나 OR 및 해당 csv 모듈 csvtool
과 같은 적절한 프로그래밍 언어를 사용해야 합니다.perl
python
답변2
시스템/제한 사항에서 허용하는 경우 CSV 전용 도구 사용을 고려해 보세요. 나는 그것을 좋아한다 (현재 지점을 유지하고 있음)GoCSV.
그것은선택하다하위 명령의 구문과 기능은 매우 유사합니다.자르다:
for file in *.csv; do
gocsv select -c 1-40 $file > processed_$file
done
그런 다음 축소되고 처리된 모든 CSV를 함께 "스택"할 수 있습니다.
gocsv stack processed_*.csv > combined.csv
GoCSV는 CSV 형식과 헤더를 이해하므로 몇 줄의 셸만으로 원하는 결과를 얻을 수 있습니다.
더미그것의 또한 있다-파일 이름옵션은 특수 그룹화 열에 파일 이름을 추가하므로 모든 행을 원래 파일로 다시 참조할 수 있습니다(그리고 예쁜 인쇄/뷰MD):
gocsv stack --filenames processed_*.csv | gocsv viewmd
| foo | File |
|-----|---------------------|
| 1 | processed_file1.csv |
| 2 | processed_file1.csv |
| 3 | processed_file2.csv |
| 4 | processed_file2.csv |