मैं अपनी फ़ाइल में प्रत्येक पंक्ति को जोड़ना चाहता हूं जो रिक्त स्थान से पिछली पंक्ति में शुरू होती है।

इनपुट फ़ाइल

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc
 =lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad
 ,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=
 rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad
 ,dc=lan

आउटपुट फ़ाइल

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-epot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

अग्रिम में धन्यवाद

1
MBA 19 अक्टूबर 2017, 18:46
dmoztools.net/Computers/Programming/Languages/Awk से आप awk से शुरुआत कर सकते हैं
 – 
woodvi
19 अक्टूबर 2017, 19:00

8 जवाब

sed के साथ:

sed ':a;N;$!ba;s/\n //g' file

मल्टीलाइन संस्करण में बेहतर समझाया गया है:

# Define a label called 'a'
:a
# Read the next line of input and append it to the
# internal pattern buffer
N
# $ means 'the last line of input'
# ! negates the match
# ba (b)ranches back to label 'a'
# Means:
# Unless we've reached the end of the input file
# read the file line by line into the pattern buffer 
$!ba
# Once the end of the input file is reached we substitute
# every occurrence of newline+space by an empty string
s/\n //g
# sed will print the result of the substitution by default

पुनश्च: sed के आपके संस्करण के आधार पर आपको इसका उपयोग करने की आवश्यकता हो सकती है:

s/
 //g

की बजाय

s/\n //g

मतलब अगर \n समर्थित नहीं है तो आपको एक शाब्दिक न्यूलाइन का उपयोग करने की आवश्यकता है


और बीटीडब्ल्यू, यदि आपकी इनपुट फ़ाइल में केवल दो पंक्तियों के जोड़े हैं जहां एक पंक्ति को पिछले में जोड़ा जाना है, और केवल वह (!), तो यह उतना आसान हो सकता है:

sed 'N;s/\n //' file

इसके लिए पूरी फाइल को मेमोरी में बफर करने की भी आवश्यकता नहीं होगी।

1
hek2mgl 19 अक्टूबर 2017, 21:02
1
मूल रूप से, जब तक आप अंतिम पंक्ति तक नहीं पहुंच जाते, तब तक बफर का निर्माण जारी रखें। जब आप अंतिम पंक्ति तक पहुँचते हैं, तो "\n" को "//" से प्रतिस्थापित करें।
 – 
souser
19 अक्टूबर 2017, 19:45

awk . का उपयोग करके संभावित समाधान

$ awk -v RS= '{gsub(/\n /,"")}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

$ awk -v OFS= -v ORS= '/^ /{$NF=$NF RS}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan


$ awk -v ORS= '/^ /{ sub(/ /,""); $NF=$NF RS}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

$ awk '/^[^ ]/{ORS=""} /^ /{OFS=""; $1=$1; ORS=RS}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

मैं पहला, दूसरा और तीसरा समाधान सुझाऊंगा।
चौथा वाला दूसरा वाला का अधिक वर्बोज़ संस्करण है।

और भी हैं लेकिन मुझे लगता है कि यह पर्याप्त होगा।

1
Rahul Verma 19 अक्टूबर 2017, 22:29

निम्नलिखित awk उसी में आपकी मदद कर सकता है।

awk '{sub(/^ +/,"");printf("%s%s",$0~/^role/?(NR==1?$0:RS $0):$0,$0)} END{print ""}'   Input_file
0
RavinderSingh13 19 अक्टूबर 2017, 18:59

एक और अजीब दृष्टिकोण:

awk '{ printf "%s%s",$1,(/^ /? ORS:"") }' file

उत्पादन:

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
0
RomanPerekhrest 19 अक्टूबर 2017, 19:25
perl -0pe 's/\n +//g' input-file
0
William Pursell 19 अक्टूबर 2017, 19:56

awk बचाव के लिए!

$ awk '{if(sub(/^ /,p,$0)) print; else p=$0}' file

roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
0
karakfa 19 अक्टूबर 2017, 20:33

यह आपके लिए काम कर सकता है (GNU sed):

sed ':a;N;s/\n //;ta;P;D' file

पैटर्न स्थान में दो पंक्तियों को पढ़ें और यदि एक संलग्न रेखा एक स्थान से शुरू होती है, तो पूर्ववर्ती नई रेखा और स्थान को हटा दें और दोहराएं। अन्यथा, पहली पंक्ति को पैटर्न स्पेस में प्रिंट करें, पहली पंक्ति को हटाएं और दोहराएं।

0
potong 20 अक्टूबर 2017, 01:07

आपके द्वारा पोस्ट किए गए डेटा को देखते हुए:

$ awk '{ORS=(sub(/^ /,"")?RS:"")}1' file
roleOccupant:uid=standard_rhc,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_test,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_NLHaNA,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan
roleOccupant:uid=standard_dept,ou=tenants,ou=users,dc=e-depot,dc=rad,dc=lan

अन्य डेटा वाईएमएमवी के साथ उम्मीद है कि आपने अपने नमूने में कुछ विचार किया है।

0
Ed Morton 21 अक्टूबर 2017, 06:20