कैसे जाग में लाइनफीड को दबाने के लिए
जबकि मैं awk
नीचे कुछ स्क्रिप्ट जीत रहा हूं , लेकिन यह कई अवांछित LF
एस उत्पन्न करता है । मुझे आश्चर्य है कि LF
इस स्क्रिप्ट के आउटपुट को कैसे (नियंत्रण) दबाया जाए । आपकी सलाह के लिए अग्रिम धन्यवाद।
awk '
BEGIN{
FS=OFS=","
}
{
nf=NF
s=0 # initialization
if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
print s
print ","
}END{}' file
फ़ाइल की सामग्री (फ़ाइल) कुछ इस तरह है,
3,1
3,2
इस मामले में, आउटपुट जैसा है
1,
1,
100
,
1,
0,
50
,
यह बहुत ही अनाड़ी है। मेरा वांछित आउटपुट जैसा है,
1,1,100
1,0,50
जवाब
$ cat input 3,1 3,2 $ awk 'BEGIN{FS=OFS=","}{c1=c2=sum=0;}$1==3{c1=1;sum+=50}$2==1{c2=1;sum+=50}{print c1,c2,sum}' input
1,1,100
1,0,50
बेहतर पठनीय:
awk 'BEGIN{
FS=OFS=","
}
{
c1=c2=sum=0; # reset variables
}
$1==3{ # if col1 equal to 3 then c1=1; sum+=50 } $2==1{ # if col2 equal to 1 then
c2=1;
sum+=50
}
{
print c1,c2,sum # print variables
}' input
क्या आप ओपी के प्रयास को यहाँ ठीक करते हुए, निम्नलिखित प्रयास कर सकते हैं। जीएनयू में ठीक किया गया और परीक्षण किया गया awk
।
awk '
BEGIN{
FS=OFS=","
}
{
s=0
if($1==3){s+=50;$1="1"} else{$1="0"} if($2==1){s+=50;$1="1"} else{$2="0"}
print $0,s
}' Input_file
ओपी के प्रयासों में सुधार:
- हटाए गए
nf
चर इसकी जरूरत नहीं है। - हमें यह नहीं छापना चाहिए कि कोई शर्त संतुष्ट हो जाती है कि क्यों आउटपुट में समस्या आ रही है, बल्कि हम मानों को फ़ील्ड में सहेज सकते हैं (जैसे -> 1 और 2 फ़ील्ड) और प्रिंट लाइन को चर के साथ अंत में।
स्पष्टीकरण: ऊपर के लिए विस्तृत विवरण जोड़ना।
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section of this program from here.
FS=OFS="," ##Setting FS and OFS as comma here.
}
{
s=0 ##Setting s as 0 here.
if($1==3){s+=50;$1="1"} else{$1="0"} ##Checking if 1st field is 3 then add 50 to s and set 1 to $1 else keep $1 as 0 here.
if($2==1){s+=50;$1="1"} else{$2="0"} ##Checking if 2nd field is 3 then add 50 to s and set 1 to $2 else keep $2 as 0 here. print $0,s ##Printing line and value of s here.
}' Input_file ##mentioning Input_file name here.
आपको बता सकते हैं कि सेटिंग के AWK
बाद प्रत्येक के बाद नई लाइन नहीं डालनी है , लेकिन फिर आपको जहां जरूरत है, वहां खुद को नई लाइन लगाने की आवश्यकता है। आपका कोड निम्नलिखित तरीके से फिर से काम किया जा सकता है:print
ORS
""
awk '
BEGIN{
ORS="";FS=OFS=","
}
{
nf=NF
s=0 # initialization
if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
print s
print "\n"
}END{}' file
तब file
सामग्री के लिए
3,1
3,2
यह उत्पादन होगा:
1,1,100
1,0,50
(गॉक 4.2.1 में परीक्षण किया गया)