여러 csv 파일의 특정 열을 복사하여 새 csv 파일에 씁니다. 쉘 스크립트

여러 csv 파일의 특정 열을 복사하여 새 csv 파일에 씁니다. 쉘 스크립트

여러 개의 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

다음과 같은 가정

  1. CSV 데이터는 "단순"합니다. 즉, 해당 필드에 쉼표나 줄 바꿈이 포함되어 있지 않습니다.
  2. 모든 파일의 줄 수는 동일합니다.
  3. 현재 디렉터리에는 하나 이상의 CSV 파일이 포함되어 있습니다.

먼저 파일 목록을 가져오겠습니다.

rm -f out.csv
filelist=( *.csv )

filelist그러면 이 패턴과 일치하는 현재 디렉터리의 모든 파일 이름을 포함하는 배열이 생성됩니다 *.csv. out.csv결과 파일에 해당 이름을 사용할 것이고 해당 이름이 존재하는 경우 처리에 포함하고 싶지 않기 때문에 먼저 제거했습니다 .

그런 다음 첫 번째 파일에서 첫 번째 열을 추출합니다. 열을 out.csv.

cut -d , -f 1 -- "${filelist[0]}" >out.csv

그런 다음 파일을 반복하면서 각 파일의 세 번째 열을 가져와 , 및 이라는 중간 파일을 out.csv통해 기존 파일에 추가합니다 .cutpasteout.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

대안이 있다면 시간을 알려주세요.

관련 정보