내 목표는 하위 디렉터리로 이동하여 SUB라고 부르는 것입니다. 여기에는 각각 5개의 열이 있고 항상 동일한 수의 행이 있는 많은 텍스트 파일이 있습니다. 2-5의 모든 열을 합산하고 첫 번째 열을 유지한 다음 파일을 출력하는 큰 "합계" 파일을 원합니다. 파일 수가 적다는 것을 알고 있는 경우 다음과 같이 수행할 수 있습니다.
cd SUB
numfiles=(*)
numfiles=${#numfiles[@]}
if [ $numfiles = 1 ]
then
paste * | awk '{print $1, $2, $3, $4, $5}' > sum
fi
if [ $numfiles = 2 ]
then
paste * | awk '{print $1, ($2+$7), ($3+$8), ($4+$9), ($5+$10)}' > sum
fi
그러나 SUB의 파일 수가 1에서 100까지일 수 있으므로 이는 번거로운 접근 방식입니다. 당신의 도움을 주셔서 감사합니다!
PS 새 "sum" 파일은 입력 텍스트 파일과 동일한 형식이어야 하며 모두 동일하게 보입니다. 예를 들어, SUB에 항목이 있는 두 개의 파일이 포함되어 있는 경우
1 2 3 4 5
2 2 3 4 5
그리고
1 4 2 7 1
2 2 5 1 9
그런 다음 "sum" 파일은 다음과 같아야 합니다.
1 6 5 11 6
2 4 8 5 14
답변1
awk '
NR==FNR {
# assuming column 1 is the same for all files, remember it.
# only need to do this for the first file
col1[FNR] = $1
}
{ for (i=2; i<=NF; i++) sum[FNR,i] += $i }
END {
for (i=1; i<=FNR; i++) {
printf "%s", col1[i]
for (j=2; j<=NF; j++) printf "%s%s", OFS, sum[i,j]
print ""
}
}
' file1 file2
1 6 5 11 6
2 4 8 5 14
nawk, gawk 및 mawk와 함께 작업해야 합니다.
답변2
여기요. 이것은 실제로 gawk
바닐라 대신 사용됩니다 awk
. 정말로 true를 사용해야 한다면 awk
구조 h[x][y]
를 h[x ";" y]
.
cd SUB
awk '
BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" }
{ h[FNR][1] = $1; for (n=2; n<=5; n++) { h[FNR][n] += $n } }
END { for (r in h) { print h[r][1], h[r][2], h[r][3], h[r][4], h[r][5] } }
' *
예제 입력을 기반으로 예상되는 출력을 제공합니다.
PROCINFO
댓글에 제안된 대로 설정을 추가했습니다 .