여러 개의 CSV 파일이 있고 폴더에서 파일이 정렬되는 것과 같은 방식으로 세 번째 열을 추출하여 새 파일에 쓰고 싶습니다. 추가는 한 열이 다른 열 아래에 있는 것이 아니라 모든 열이 나란히 놓이는 방식으로 수행되어야 합니다. 여러 명령을 사용했습니다
paste -d "," *csv >> Main.csv
이로 인해 데이터가 잘못된 순서로 추가됩니다. 파일이 잘못 정렬되었습니다. (특정 열만 추가하는 방법을 이해할 수 없습니다. 전체 파일이 나란히 추가되지만)
cut -d ',' -f1-2 *.csv t.csv
데이터가 나란히 있는 것이 아니라 다른 것 아래에 하나씩 추가됩니다. (그리고 두 개의 열을 추가하면 한 개의 열을 추가하도록 변경할 수 있습니다).
cut -d ',' -f1-2 File1.csv | paste File2.csv - > Main.csv
이 방법은 2개의 파일에 대해 작동하지만 여러 파일을 읽으려면 어떻게 확장할 수 있습니까?
Eg:-
File_1.csv
a,32,37
b,26,34
c,56,65
File_2.csv
a,92,60
b,48,63
c,52,23
File_3.csv
a,2,37
b,45,53
c,56,63
.
.
.
.
Output_File.csv
a,37,60,37 . . . .
b,34,63,53 . . . .
c,65,23,63 . . . .
답변1
다음과 같은 가정
- CSV 데이터는 "단순"합니다. 즉, 해당 필드에 쉼표나 줄 바꿈이 포함되어 있지 않습니다.
- 모든 파일의 줄 수는 동일합니다.
- 현재 디렉터리에는 하나 이상의 CSV 파일이 포함되어 있습니다.
먼저 파일 목록을 가져오겠습니다.
rm -f out.csv
filelist=( *.csv )
filelist
그러면 이 패턴과 일치하는 현재 디렉터리의 모든 파일 이름을 포함하는 배열이 생성됩니다 *.csv
. out.csv
결과 파일에 해당 이름을 사용할 것이고 해당 이름이 존재하는 경우 처리에 포함하고 싶지 않기 때문에 먼저 제거했습니다 .
그런 다음 첫 번째 파일에서 첫 번째 열을 추출합니다. 열을 out.csv
.
cut -d , -f 1 -- "${filelist[0]}" >out.csv
그런 다음 파일을 반복하면서 각 파일의 세 번째 열을 가져와 , 및 이라는 중간 파일을 out.csv
통해 기존 파일에 추가합니다 .cut
paste
out.tmp
for file in "${filelist[@]}"; do
cut -d , -f 3 -- "$file" | paste -d , out.csv - >out.tmp &&
mv out.tmp out.csv
done
모든 것이 있지만 /bin/sh
(배열 없이) 다음과 같이 다시 작성되었습니다.
rm -f out.csv
set -- *.csv
cut -d , -f 1 -- "$1" >out.csv
for file do
cut -d , -f 3 -- "$file" | paste -d , out.csv - >out.tmp &&
mv out.tmp out.csv
done
답변2
사용하기 매우 쉬운 코드는 다음과 같습니다.
paste -d"," *csv>>OG.csv
cut --complement -d',' -f3,4,5,7,8,10,.. OG.csv>>Data.csv
대안이 있다면 시간을 알려주세요.