Thêm danh sách các giá trị của cột A và B được phân tách bằng dấu cách và hiển thị kết quả tổng kết [trùng lặp]
Tôi có một tệp được gọi là fold.txt. Nó có hai giá trị trong mỗi dòng cách nhau một khoảng trắng. Nếu tôi nói rằng giá trị đầu tiên đại diện cho cột A và giá trị thứ hai sau dấu cách là cột B thì làm thế nào tôi có thể thêm tất cả các giá trị của cột A và tất cả các giá trị của cột B và hiển thị tổng của từng cột riêng lẻ?
Tôi đang mong đợi một cái gì đó như thế này:
$ cat fold.txt
100 500
200 300
700 100
Đầu ra:
Total count Column A = 1000
Total count column B = 900
Trả lời
Với awk:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
trong ngôn ngữ awk , là một công cụ cho mục đích xử lý văn bản, $1đại diện cho giá trị của cột đầu tiên, $2đại diện cho giá trị của cột thứ hai, $3cho thứ ba, v.v. và một cái đặc biệt NFlà đại diện cho Id cột cuối cùng và theo đó $NFlà giá trị của cột cuối cùng (vì vậy bạn có thể thay thế $2ở trên với $NFquá; và có bạn nắm bắt được khi nào NFlà Id cột cuối cùng, vì vậy giá trị của biến cho bạn biết bạn có bao nhiêu cột (cập nhật giá trị của nó cho mỗi dòng awk được đọc ở dạng đầu vào)).
Để xử lý trường hợp cạnh trong đó tệp đầu vào trống và vẫn nhận được đầu ra số, chúng tôi thêm 0 vào kết quả buộc awkxuất ra kết quả số.
các cột (hoặc các trường) được awkphân biệt bằng FSbiến ( Dấu phân tách F eild S ) mà mặc định là sử dụng Dấu cách / Tab. nếu bạn muốn các cột được phân chia theo các ký tự khác nhau, bạn có thể xác định lại nó bằng -Ftùy chọn awknhư trong:
awk -F'<character-here>' '...' infile
hoặc trong BEGIN{...}khối như với FS:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
ví dụ cho một tệp đầu vào như bên dưới (bây giờ nó là dấu phẩy thay vì dấu cách):
100,500
200,300
700,100
bạn có thể viết awkmã của mình như sau:
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Hoặc trong BEGINkhối:
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Hơi phức tạp một chút và tính tổng tất cả N cột của tệp đầu vào của bạn trên mẫu sau:
100,500,140,400
200,300,640,200
700,100,400,130
Vì vậy, chúng tôi đã nói về NFtrong đoạn đầu tiên (giá trị NF cho bạn biết bạn có bao nhiêu cột (cập nhật trên mỗi dòng)):
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
điều mới duy nhất ở đây là chúng ta đã sử dụng awkmảng để giải quyết cùng một cột Id lấy từ giá trị của ivà thêm giá trị của chúng $ivào mảng đó (chỉ mục / khóa của mảng này là Id cột); sau đó tại END{...}khối, chúng ta lặp lại mảng của mình trên các khóa mà nó được nhìn thấy, sau đó in cột Id trước rồi tính tổng của những cái bên cạnh nó, bạn sẽ thấy kết quả như dưới đây:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
Đó là một công việc tốt cho dc.
dc đọc dữ liệu đầu tiên từ fold.txt và sau mã từ sum_col_dc.
Sử dụng nó như vậy: dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
Với một chút chi tiết:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
Thưởng thức dc
Thêm giải thích theo yêu cầu.