जाग के साथ अधिकांश समाधान एक स्थान छोड़ देते हैं। यहां विकल्प उस समस्या से बचते हैं।
विकल्प 1
एक सरल कटौती समाधान (केवल एकल सीमांकक के साथ काम करता है):
command | cut -d' ' -f3-
विकल्प 2
एक फ़िर से जागने के लिए मजबूर करने वाले पहले स्थान को हटाकर बचे हुए अग्रणी स्थान (OFS) को हटा दें (awk के कुछ संस्करणों के साथ काम करता है):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
विकल्प 3
प्रत्येक क्षेत्र के साथ स्वरूपित मुद्रण printf
अधिक नियंत्रण देगा:
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8
हालाँकि, पिछले सभी उत्तर फ़ील्ड के बीच सभी दोहराया FS को OFS में बदल देते हैं। चलो एक विकल्प का निर्माण करें जो ऐसा न करें।
विकल्प 4 (अनुशंसित)
एक लूप उप के साथ खेतों और मोर्चे को हटाने के लिए सामने।
और अंतरिक्ष के बजाय एफएस के मूल्य का उपयोग करना (जिसे बदला जा सकता था)।
अधिक पोर्टेबल है, और करने के लिए ओएफएस एफएस का एक परिवर्तन को गति प्रदान नहीं करता है:
नोट:^[FS]*
प्रमुख स्थान के साथ एक इनपुट स्वीकार करना है।
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3 4 5 6 7 8
विकल्प 5
एक समाधान का निर्माण करना काफी संभव है जो अतिरिक्त (अग्रणी या अनुगामी) व्हाट्सएप को नहीं जोड़ता है, और gensub
जीएनयू अवेक से फ़ंक्शन का उपयोग करके मौजूदा व्हाट्सएप (एस) को संरक्षित करता है:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{ print(gensub(a""b""c,"",1)); }'
3 4 5 6 7 8
यह भी एक गिनती दिया क्षेत्रों के एक समूह स्वैप करने के लिए इस्तेमाल किया जा सकता है n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{
d=gensub(a""b""c,"",1);
e=gensub("^(.*)"d,"\\1",1,$0);
print("|"d"|","!"e"!");
}'
|3 4 5 6 7 8 | ! 1 2 !
बेशक, ऐसे मामले में, ओएफएस का उपयोग लाइन के दोनों हिस्सों को अलग करने के लिए किया जाता है, और खेतों के पीछे की सफेद जगह अभी भी मुद्रित होती है।
नोट: [FS]*
इनपुट लाइन में अग्रणी स्थान की अनुमति देने के लिए उपयोग किया जाता है।
grep | awk
एकawk '/!/ { print $2 }'