2012-05-09 12 views
23

मेरे file.txt की प्रत्येक पंक्ति पर योग इस तरह दिखता है:awk राशि एक स्तंभ और प्रिंट कि इनपुट

awk '{ sum += $2 } END { print sum }' file.txt

272

:

1 12 
2 18 
3 45 
4 5 
5 71 
6 96 
7 13 
8 12 

मैं इस तरह दूसरे स्तंभ जोड़ सकते हैं

प्रत्येक लाइन पर उस योग को मुद्रित करने का सबसे अच्छा तरीका क्या है? यह मैं क्या उम्मीद कर रहा हूँ है:

1 12 272 
2 18 272 
3 45 272 
4 5 272 
5 71 272 
6 96 272 
7 13 272 
8 12 272 
+0

सभी को धन्यवाद! यहां कुछ बहुत उपयोगी उत्तर हैं। चीयर्स। – Steve

उत्तर

19

मानक awk तरीका का प्रकार और पढ़ें।

$ awk 'FNR==NR{sum+=$2;next}; {print $0,sum}' file.txt{,} 
1 12 272 
2 18 272 
3 45 272 
4 5 272 
5 71 272 
6 96 272 
7 13 272 
8 12 272 
+0

'{,} 'वाइल्डकार्ड प्रत्यय इनपुट फ़ाइल नाम दो बार दोहराने के लिए एक शॉर्टेंड है। यह मानक बोर्न खोल नहीं है। – tripleee

+1

यह कैननिकल AWK है और फ़ाइल को स्मृति में संग्रहीत नहीं करता है। यह स्वीकार्य उत्तर होना चाहिए। –

+0

@ डेनिसविल्लियमसन, हैलो, क्या आप इस बारे में समझाएंगे कि यह अजीब स्मृति में फ़ाइल को संग्रहीत नहीं करता है?धन्यवाद –

1

Offtopic, लेकिन पर्ल में आप कर सकते हैं:

perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt 
7

आप उपयोग कर सकते हैं:

awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt) 
    '{print $0" "xyzzy}' file.txt 

यह दुर्भाग्य जानकारी माध्यम से जा रहा मतलब है दो बार लेकिन, चूंकि आपको कुल प्राप्त करने से पहले इसे एक बार करना है, इसके आसपास कोई वास्तविक तरीका नहीं है। कोई भी समाधान कुछ भी आउटपुट करने से पहले जानकारी को संग्रहीत करने में शामिल होगा (चाहे सरणी में हो या फ़ाइल पर वापस जा रहा हो)।

आंतरिक awk कुल कार्य करता है और बाहरी awk एक चर के लिए निर्दिष्ट करता है जिसे प्रत्येक पंक्ति के साथ मुद्रित किया जा सकता है। ,

a 1 
b 2 
c 3 
d 4 
e 5 

आप देता है क्योंकि 1 + 2 + 3 + 4 + 5 बराबर है 15 लिए:

फाइल करने के लिए है कि लागू करने

a 1 15 
b 2 15 
c 3 15 
d 4 15 
e 5 15 
+0

@ कोडडिक्ट: क्या आपका मतलब है "... _can't_ store ..."? – paxdiablo

+0

हाँ..मुझे नहीं पता कि वहां क्या हुआ :) – codaddict

3

उपयोग सरणियों

{ 
    a[NR] = $0 
    sum += $2 
} 
END { 
    for (x = 1; x <= NR; x++) { 
     print a[x], sum 
    } 
} 

आउटपुट

$ awk -f s.awk file.txt 
1 12 272 
2 18 272 
3 45 272 
4 5 272 
5 71 272 
6 96 272 
7 13 272 
8 12 272 

में Gnu Awk Manual

1

बदसूरत समाधान:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047 file ")}' file 
1

awk, हाँ, सिर और पेस्ट।

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt - 
संबंधित मुद्दे