Bash 명령을 사용하여 여러 .csv 파일 추가

Bash 명령을 사용하여 여러 .csv 파일 추가

bash를 사용하여 폴더에서 무작위로 생성된 모든 CSV 파일을 반복하고 한 줄씩 추가하고 싶습니다. 각 CSV 파일에는 3개의 줄이 있습니다. 첫 번째 줄은 생성된 파일 수만 나타냅니다(1~50개). 합계에 포함될 필요는 없습니다. 이 폴더에는 사용자 입력에 따라 무작위로 생성된 약 5~6개의 CSV 파일이 있을 수 있습니다. 각 CSV 파일의 형식은 다음과 같습니다.

node1.csv

1 | 998749 | 39
2 | 989758 | 84 
3 | 1002785| 43 
4 | 997485 | 98 
5 | 996584 | 86 
6 | 1038453| 14
(continues... )

node2.csv

1 | 1098749| 49
2 | 899758 | 47 
3 | 992785 | 43 
4 | 1097458|98 
5 | 996584 |86 
6 | 998453| 14
(continues)

node3.csv

1 | 998999 | 40
2 | 989758 | 50 
3 | 1002785| 70 
4 | 997485 | 89 
5 | 1006584| 33 
6 | 989453 | 10
(continues)

예상 출력은 다음과 같습니다

1 | 3096625
2 | 2879455
3 | 2998511
4 | 3092713
5 | 2999957
6 | 3026397
(continues...)

기본적으로 폴더에 있는 모든 csv 파일의 내용을 요약하고 싶습니다. csv 파일의 이름은 다음과 같을 수 있습니다: node-1.csv, node-2.csv, node-3.csv.. . 등. 각 csc 파일의 내용은 위에 표시된 것과 같습니다. 첫 번째 열은 1-50 이상의 숫자, 두 번째 열은 로컬 잔액, 세 번째 열은 거래입니다. 모든 파일을 한 줄씩 추가하고 싶습니다. 즉, 각 줄의 총 출력을 알기 위해 1부터 50까지의 숫자를 추가하고 싶습니다.

답변1

이는 AWK에 이상적인 작업입니다.

awk -F '|' \
    '    {results[$1+0]+=$2+$3} \
     END {for (i in results) \
              if (i != 0) \
                  print i" | "results[i]}' *.csv \
| sort --key=1 --field-separator='|' --numeric-sort

-F '|'행이 파이프 문자로 분할됨을 나타냅니다. 즉, 문자열이 , 및 3 1 | 2 | 3개의 필드로 분할됩니다 .123

각 행에 대해 다음 블록을 실행합니다.

{results[$1+0]+=$2+$3}

results연관 배열입니다. 이 배열의 인덱스는 첫 번째 필드가 됩니다(예: 숫자 1). (문자열을 숫자로 변환하기 위해 0을 추가합니다.) 그런 다음 두 번째와 세 번째 필드를 추가하고 그 결과를 특정 기존 개수의 필드 1 값에 추가합니다. (처음에는 배열의 모든 셀이 0입니다.)

모든 행이 처리되면 END블록이 실행됩니다. 그것이 하는 일은 배열의 내용을 인쇄하고 필드를 파이프 문자로 구분하는 것뿐입니다. if입력의 모든 빈 줄에 해당하는 항목을 필터링합니다 .

마지막으로 파이프를 필드 구분 기호로 다시 사용하여 첫 번째 필드를 기준으로 출력을 정렬합니다(원하는 것으로 가정합니다).

관련 정보