
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
개의 필드로 분할됩니다 .1
2
3
각 행에 대해 다음 블록을 실행합니다.
{results[$1+0]+=$2+$3}
results
연관 배열입니다. 이 배열의 인덱스는 첫 번째 필드가 됩니다(예: 숫자 1). (문자열을 숫자로 변환하기 위해 0을 추가합니다.) 그런 다음 두 번째와 세 번째 필드를 추가하고 그 결과를 특정 기존 개수의 필드 1 값에 추가합니다. (처음에는 배열의 모든 셀이 0입니다.)
모든 행이 처리되면 END
블록이 실행됩니다. 그것이 하는 일은 배열의 내용을 인쇄하고 필드를 파이프 문자로 구분하는 것뿐입니다. if
입력의 모든 빈 줄에 해당하는 항목을 필터링합니다 .
마지막으로 파이프를 필드 구분 기호로 다시 사용하여 첫 번째 필드를 기준으로 출력을 정렬합니다(원하는 것으로 가정합니다).