Nth से लास्ट तक सभी कॉलम को प्रिंट करने के लिए awk का उपयोग करना


310

इस लाइन ने तब तक काम किया जब तक मेरे पास दूसरे क्षेत्र में व्हॉट्सएप नहीं था।

svn status | grep '\!' | gawk '{print $2;}' > removedProjs

वहाँ $ 2 या अधिक में सब कुछ जाग जागने का एक तरीका है? ($ 3, $ 4 .. जब तक हमारे पास कॉलम नहीं हैं?)

मुझे लगता है कि मुझे यह जोड़ना चाहिए कि मैं सिग्विन के साथ विंडोज वातावरण में ऐसा कर रहा हूं।


11
एक तरफ के रूप में, grep | awkएकawk '/!/ { print $2 }'
एंटीपैटर्न है

3
यूनिक्स "कट" आसान है ...svn status | grep '\!' | cut -d' ' -f2- > removedProjs
डकैती


@tripleee: मैं बहुत खुश हूँ कि आपने इसका उल्लेख किया - मैं इसे हर जगह देखकर निराश हूँ!
ग्राहम निकोल्स 16

जवाबों:


489

सभी लेकिन बहुत पहले कॉलम को प्रिंट करेगा:

awk '{$1=""; print $0}' somefile

सभी पहले दो कॉलमों को प्रिंट करेंगे:

awk '{$1=$2=""; print $0}' somefile

93
gotcha: के बारे में एक प्रमुख स्थान झूलने छोड़ देता है :(
raphinesse

5
मुझे व्यावहारिक दृष्टिकोण पसंद है। हालांकि बिल्ली का उपयोग करने की कोई आवश्यकता नहीं है, बस awk कमांड के बाद फ़ाइल नाम रखें।
कोन

45
@ साक्षरता आप ठीक कर सकते हैंawk '{$1=""; print substr($0,2)}' input_filename > output_filename
themiurgo

6
यह गैर-व्हाट्सएप सीमांकक के साथ काम नहीं करता है, उन्हें एक स्थान के साथ बदल देता है।
देजन

3
गैर-व्हाट्सएप सीमांकक के लिए, आप आउटपुट फ़ील्ड सेपरेटर (OFS) को निर्दिष्ट कर सकते हैं, उदाहरण के लिए अल्पविराम: awk -F, -vOFS=, '{$1=""; print $0}'आप एक प्रारंभिक सीमांकक के साथ समाप्त हो जाएगा ( $1अभी भी शामिल है, एक खाली स्ट्रिंग के रूप में)। sedहालांकि, आप इसे स्ट्रिप कर सकते हैं :awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
cherdt

99

कट का उपयोग करके सरल उत्तर के साथ एक डुप्लिकेट प्रश्न है :

 svn status |  grep '\!' | cut -d\  -f2-

-dडेलीमीटर (स्पेस) को -fनिर्दिष्ट करता है , कॉलम की सूची निर्दिष्ट करता है (सभी 2 से शुरू)


आप स्थिति (आगे के वर्ण से) को निर्दिष्ट करने के लिए "-b" का भी उपयोग कर सकते हैं।
डाकाटाइन

एक नोट के रूप में, हालांकि यह awkसंस्करण के समान कार्य करता है , इसके साथ लाइन बफ़रिंग मुद्दे हैं cut, जिनके awkपास नहीं है: stackoverflow.com/questions/14360640/…
sdaau

24
अच्छा और सरल, लेकिन एक चेतावनी के साथ आता है: awkकई आसन्न अंतरिक्ष वर्णों का इलाज करता है। एक के रूप में एक विभाजक है, जबकि cutऐसा नहीं करता; यह भी - हालांकि यह मामले में समस्या नहीं है - cutकेवल एक ही, शाब्दिक चार को स्वीकार करता है। सीमांकक के रूप में, जबकि awkएक regex की अनुमति देता है।
mklement0

इसके आधार पर: stackoverflow.com/a/39217130/8852408 , संभावना है कि यह समाधान बहुत कुशल नहीं है।
FcknGioconda

85

आप $ NF (बिल्ट-इन वैरिएबल जो लाइन पर फ़ील्ड्स की संख्या का प्रतिनिधित्व करता है) के माध्यम से मुद्रण क्षेत्र $ 2 के माध्यम से लूप के लिए एक लूप का उपयोग कर सकते हैं।

संपादित करें: चूंकि "प्रिंट" एक नई पंक्ति को जोड़ता है, आप परिणामों को बफर करना चाहेंगे:

awk '{out=""; for(i=2;i<=NF;i++){out=out" "$i}; print out}'

वैकल्पिक रूप से, प्रिंटफ का उपयोग करें:

awk '{for(i=2;i<=NF;i++){printf "%s ", $i}; printf "\n"}'

तो मैंने यह कोशिश की, लेकिन मुझे लगता है कि मैं कुछ याद कर रहा हूँ .. यहाँ मैंने svn स्थिति क्या है | grep '\'! | gawk '{for (i = 1; i <= $ NF; i ++) प्रिंट $ i "";}'> निकाले गए
एंडी

चूंकि प्रिंट एक नई पंक्ति को जोड़ता है, आप परिणामों को बफर करना चाहेंगे। मेरा संपादन देखें।
वीर्र

1
मुझे यह उत्तर बेहतर लगता है क्योंकि यह दिखाता है कि खेतों के माध्यम से कैसे लूप किया जाता है।
एडवर्ड फल्क

3
यदि आप किसी स्थान का उपयोग करने के लिए प्रिंट चाहते हैं, तो आउटपुट रिकॉर्ड विभाजक बदलें: awk '{ORS = ""; (i = 2; मैं <एनएफ; मैं ++) $ i प्रिंट} 'somefile
ईसाई Lescuyer

3
हमेशा कुछ स्थान बहुत अधिक होगा। यह बेहतर काम करता है: '{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'कोई अग्रणी या अनुगामी स्थान नहीं।
मार्की

24
awk '{out=$2; for(i=3;i<=NF;i++){out=out" "$i}; print out}'

मेरा उत्तर आधारित है VeeArr के एक , लेकिन मैंने देखा कि यह दूसरे कॉलम (और बाकी) को प्रिंट करने से पहले एक सफेद स्थान के साथ शुरू हुआ था। जैसा कि मेरे पास केवल 1 प्रतिष्ठा बिंदु है, मैं इस पर टिप्पणी नहीं कर सकता, इसलिए यहां एक नए उत्तर के रूप में दिया गया है:

दूसरे कॉलम के रूप में "आउट" से शुरू करें और फिर अन्य सभी कॉलम (यदि वे मौजूद हैं) जोड़ें। यह तब तक अच्छी तरह से चलता है जब तक दूसरा कॉलम है।


2
बहुत बढ़िया, आपने $ को आउट वेरिएबल के सामने भी हटा दिया जो महत्वपूर्ण भी है।
एलेक्सिस विल्के

15

जाग के साथ अधिकांश समाधान एक स्थान छोड़ देते हैं। यहां विकल्प उस समस्या से बचते हैं।

विकल्प 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]* इनपुट लाइन में अग्रणी स्थान की अनुमति देने के लिए उपयोग किया जाता है।


13

मैंने ऊपर वर्णित सभी उत्तरों को व्यक्तिगत रूप से आज़माया, लेकिन उनमें से अधिकांश थोड़े जटिल थे या ठीक नहीं थे। मेरे दृष्टिकोण से इसे करने का सबसे आसान तरीका है:

awk -F" " '{ for (i=4; i<=NF; i++) print $i }'
  1. कहाँ -F "" का उपयोग करने के लिए जाग के लिए सीमांकक को परिभाषित करता है। मेरे मामले में व्हाट्सएप है, जो कि awk के लिए डिफ़ॉल्ट सीमांकक भी है। इसका मतलब यह है कि -F "" को अनदेखा किया जा सकता है।

  2. जहाँ NF फील्ड / कॉलम की कुल संख्या को परिभाषित करता है। इसलिए लूप 4 वें फ़ील्ड से अंतिम फ़ील्ड / कॉलम तक शुरू होगा।

  3. जहाँ $ N, Nth फ़ील्ड का मान प्राप्त करता है। इसलिए $ $ प्रिंट करें मैं लूप काउंट के आधार पर करंट फील्ड / कॉलम प्रिंट करेगा।


4
समस्या, जो प्रत्येक क्षेत्र को एक अलग रेखा पर प्रिंट करती है।
मावरोन

कुछ भी नहीं आप इसे अंत में रोक रहा है :-) `` | tr '\ n' '' `
koullislp

3
थोडा देर से, लेकिन awk '{for (i = 5; i <= NF; i ++) {Printf "% s", $ i}}'
plitter


7

यह मुझे बहुत परेशान कर रहा था, मैं बैठ गया और cutजीएनयू Awk 3.1.7 के साथ परीक्षण किया गया एक समान क्षेत्र विनिर्देश पार्सर लिखा ।

सबसे पहले, pfcutउदाहरण के साथ, एक नई Awk लाइब्रेरी स्क्रिप्ट बनाएं

sudo nano /usr/share/awk/pfcut

फिर, नीचे दी गई स्क्रिप्ट में पेस्ट करें, और सहेजें। उसके बाद, यह इस तरह दिखता है:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-4"); }'
t1 t2 t3 t4

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("2-"); }'
t2 t3 t4 t5 t6 t7

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-2,4,6-"); }'
t1 t2 t4 t6 t7

वह सब टाइप करने से बचने के लिए, मुझे लगता है कि जो सबसे अच्छा काम कर सकता है (देखें अन्यथा स्टार्टअप के साथ स्वचालित रूप से उपयोगकर्ता फ़ंक्शन लोड करना; - यूनिक्स और लिनक्स स्टैक एक्सचेंज ) एक उपनाम है ~/.bashrc; जैसे:

$ echo "alias awk-pfcut='awk -f pfcut --source'" >> ~/.bashrc
$ source ~/.bashrc     # refresh bash aliases

... तो आप बस कॉल कर सकते हैं:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk-pfcut '/^/ { pfcut("-2,4,6-"); }'
t1 t2 t4 t6 t7

यहाँ pfcutस्क्रिप्ट का स्रोत है :

# pfcut - print fields like cut
#
# sdaau, GNU GPL
# Nov, 2013

function spfcut(formatstring)
{
  # parse format string
  numsplitscomma = split(formatstring, fsa, ",");
  numspecparts = 0;
  split("", parts); # clear/initialize array (for e.g. `tail` piping into `awk`)
  for(i=1;i<=numsplitscomma;i++) {
    commapart=fsa[i];
    numsplitsminus = split(fsa[i], cpa, "-");
    # assume here a range is always just two parts: "a-b"
    # also assume user has already sorted the ranges
    #print numsplitsminus, cpa[1], cpa[2]; # debug
    if(numsplitsminus==2) {
     if ((cpa[1]) == "") cpa[1] = 1;
     if ((cpa[2]) == "") cpa[2] = NF;
     for(j=cpa[1];j<=cpa[2];j++) {
       parts[numspecparts++] = j;
     }
    } else parts[numspecparts++] = commapart;
  }
  n=asort(parts); outs="";
  for(i=1;i<=n;i++) {
    outs = outs sprintf("%s%s", $parts[i], (i==n)?"":OFS); 
    #print(i, parts[i]); # debug
  }
  return outs;
}

function pfcut(formatstring) {
  print spfcut(formatstring);
}

लगता है जैसे आप का उपयोग करना चाहते हैं cut, नहींawk
लूटना

5

# 2 से शुरू होने वाले स्तंभों को प्रिंट करना (आउटपुट की शुरुआत में कोई अनुगामी स्थान नहीं होगा):

ls -l | awk '{sub(/[^ ]+ /, ""); print $0}'

1
अच्छा है, हालांकि आपको +अंतरिक्ष के बाद जोड़ना चाहिए , क्योंकि खेतों को 1 से अधिक स्थान से अलग किया जा सकता है ( awkएक ही विभाजक के रूप में कई आसन्न रिक्त स्थान मानते हैं)। इसके अलावा, awkप्रमुख स्थानों को अनदेखा कर देगा, इसलिए आपको रेगेक्स को शुरू करना चाहिए ^[ ]*। विभाजक के रूप में अंतरिक्ष के साथ आप समाधान को भी सामान्य कर सकते हैं; उदाहरण के लिए, निम्नलिखित 3 क्षेत्र से सब कुछ लौटाता है: awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'यह मनमाने ढंग से क्षेत्र विभाजकों के साथ पेचीदा हो जाता है, हालांकि।
mklement0

5

क्या यह काम करेगा?

awk '{print substr($0,length($1)+1);}' < file

यह हालांकि सामने कुछ व्हाट्सएप छोड़ता है।


4
echo "1 2 3 4 5 6" | awk '{ $NF = ""; print $0}'

यह अंतिम क्षेत्र को छोड़कर सभी को प्रिंट करने के लिए awk का उपयोग करता है


3

यह वही है जो मैंने सभी सिफारिशों से पसंद किया है:

छठे से अंतिम स्तंभ तक मुद्रण।

ls -lthr | awk '{out=$6; for(i=7;i<=NF;i++){out=out" "$i}; print out}'

या

ls -lthr | awk '{ORS=" "; for(i=6;i<=NF;i++) print $i;print "\n"}'

2

यदि आपको मनमाने ढंग से परिधि के साथ मुद्रित विशिष्ट कॉलम की आवश्यकता है:

awk '{print $3 "  " $4}'

col # 3 col # 4

awk '{print $3 "anything" $4}'

col # 3anythingcol # 4

इसलिए यदि आपके पास एक कॉलम में व्हाट्सएप है, तो यह दो कॉलम होगा, लेकिन आप इसे किसी भी सीमांकक या इसके बिना जोड़ सकते हैं।


2

पर्ल समाधान:

perl -lane 'splice @F,0,1; print join " ",@F' file

इन कमांड-लाइन विकल्पों का उपयोग किया जाता है:

  • -n इनपुट फ़ाइल की प्रत्येक पंक्ति के चारों ओर लूप, स्वचालित रूप से प्रत्येक पंक्ति को प्रिंट न करें

  • -l प्रसंस्करण से पहले नए सिरे को हटाता है, और बाद में उन्हें वापस जोड़ता है

  • -aऑटोसप्लिट मोड - @F सरणी में इनपुट लाइनों को विभाजित करें। व्हॉट्सएप पर बंटवारे की चूक

  • -e पर्ल कोड निष्पादित करें

splice @F,0,1 कॉलम को @F सरणी से कॉलम 0 को हटाता है

join " ",@F प्रत्येक तत्व के बीच में जगह का उपयोग करके @F सरणी के तत्वों में शामिल होता है


अजगर समाधान:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file


1

यदि आप उस रेखा के उस भाग को पुन: स्वरूपित नहीं करना चाहते हैं जिसे आप काटते नहीं हैं, तो मैं जो सबसे अच्छा समाधान सोच सकता हूं वह मेरे उत्तर में लिखा गया है:

Awk का उपयोग करके किसी विशेष संख्या के बाद सभी कॉलम कैसे प्रिंट करें?

यह दी गई फील्ड नंबर N से पहले की बात को काट देता है, और बाकी सभी लाइन को प्रिंट करता है, जिसमें फ़ील्ड नंबर N और मूल रिक्ति को बनाए रखना शामिल है (यह रिफॉर्मेट नहीं करता है)। यह मैटर नहीं करता है यदि फ़ील्ड का स्ट्रिंग लाइन में कहीं और भी दिखाई देता है।

एक फ़ंक्शन को परिभाषित करें:

fromField () { 
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

और इसे इस तरह से उपयोग करें:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

आउटपुट सब कुछ रखता है, जिसमें अनुगामी रिक्त स्थान भी शामिल है

आप विशेष मामले में:

svn status | grep '\!' | fromField 2 > removedProjs

यदि आपकी फ़ाइल / स्ट्रीम में लाइनों के बीच में नए-पंक्ति वर्ण नहीं हैं (आप एक अलग रिकॉर्ड विभाजक का उपयोग कर सकते हैं), तो आप उपयोग कर सकते हैं:

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

पहला मामला केवल उन फाइलों / धाराओं में विफल होगा जिनमें दुर्लभ हेक्साडेसिमल चार नंबर 1 शामिल है


0

यह काम करेगा यदि आप बैश का उपयोग कर रहे हैं और आप कई 'x' का उपयोग कर सकते हैं जैसे कि आप जिन तत्वों को छोड़ना चाहते हैं और यदि वे बच नहीं जाते हैं तो यह कई स्थानों की उपेक्षा करता है।

while read x b; do echo "$b"; done < filename

0

पर्ल:

@m=`ls -ltr dir | grep ^d | awk '{print \$6,\$7,\$8,\$9}'`;
foreach $i (@m)
{
        print "$i\n";

}

1
यह उस सवाल का जवाब नहीं देता है, जो Nth कॉलम से अंत तक प्रिंट करने की आवश्यकता को सामान्य करता है ।
रोज़ा

0

इस awkसमारोह रिटर्न के सबस्ट्रिंग $0कि से फ़ील्ड शामिल beginकरने के लिए end:

function fields(begin, end,    b, e, p, i) {
    b = 0; e = 0; p = 0;
    for (i = 1; i <= NF; ++i) {
        if (begin == i) { b = p; }
        p += length($i);
        e = p;
        if (end == i) { break; }
        p += length(FS);
    }
    return substr($0, b + 1, e - b);
}

फ़ील्ड 3 से शुरू होने वाली हर चीज़ पाने के लिए:

tail = fields(3);

$0उस अनुभाग को प्राप्त करने के लिए फ़ील्ड 3 से 5 को शामिल किया गया:

middle = fields(3, 5);

b, e, p, iफंक्शन पैरामीटर सूची में बकवास awkस्थानीय चर घोषित करने का एक तरीका है।


0

मैं प्रस्तावित उत्तर को उस स्थिति में विस्तारित करना चाहता हूं जहां फ़ील्ड संभवतः कई व्हाट्सएप द्वारा सीमांकित हैं -इस कारण से कि ओपी उपयोग नहीं कर रहा हैcut मैं रहा हूं।

मुझे पता है कि ओपी ने इसके बारे में पूछा था awk, लेकिन एक sedदृष्टिकोण यहां काम करेगा (उदाहरण 5 वीं से अंतिम तक छपाई कॉलम के साथ):

  • शुद्ध sed दृष्टिकोण

    sed -r 's/^\s*(\S+\s+){4}//' somefile

    स्पष्टीकरण:

    • s/// प्रतिस्थापन करने के लिए मानक तरीके का उपयोग किया जाता है
    • ^\s* लाइन की शुरुआत में किसी भी व्हाट्सएप से मेल खाता है
    • \S+\s+ डेटा का एक स्तंभ का अर्थ है (व्हाट्सएप चार्ट के बाद गैर-व्हाट्सएप चार्ट)
    • (){4} मतलब पैटर्न 4 बार दोहराया जाता है।
  • सीड और कट

    sed -r 's/^\s+//; s/\s+/\t/g' somefile | cut -f5-

    केवल एक टैब द्वारा लगातार व्हाट्सएप को बदलने के द्वारा;

  • ट्र और कट: विकल्प के साथ लगातार पात्रों trको निचोड़ने के लिए भी इस्तेमाल किया जा सकता है -s

    tr -s [:blank:] <somefile | cut -d' ' -f5-

-1

अवाक उदाहरण यहां जटिल दिखते हैं, यहां सरल बैश शेल सिंटैक्स है:

command | while read -a cols; do echo ${cols[@]:1}; done

0 से 1आपके n वें कॉलम की गिनती कहां है ।


उदाहरण

फ़ाइल की इस सामग्री को देखते हुए ( in.txt):

c1
c1 c2
c1 c2 c3
c1 c2 c3 c4
c1 c2 c3 c4 c5

यहाँ उत्पादन है:

$ while read -a cols; do echo ${cols[@]:1}; done < in.txt 

c2
c2 c3
c2 c3 c4
c2 c3 c4 c5

-1

मैं awkयहां प्रस्तुत किसी भी समाधान से खुश नहीं था क्योंकि मैं पहले कुछ कॉलम निकालना चाहता था और फिर बाकी प्रिंट करना चाहता था, इसलिए मैं perlइसके बजाय बदल गया । निम्नलिखित कोड पहले दो कॉलमों को निकालता है, और शेष को निम्न प्रकार से प्रदर्शित करता है:

echo -e "a  b  c  d\te\t\tf g" | \
  perl -ne 'my @f = split /\s+/, $_, 3; printf "first: %s second: %s rest: %s", @f;'

क्रिस कोकनटperl से समाधान की तुलना में लाभ यह है कि वास्तव में केवल पहले एन तत्वों को इनपुट स्ट्रिंग से अलग किया जाता है; बाकी स्ट्रिंग बिल्कुल भी विभाजित नहीं है और इसके लिए पूरी तरह से बरकरार है। मेरा उदाहरण रिक्त स्थान और टैब के मिश्रण से यह प्रदर्शित करता है।

स्तंभों की मात्रा को निकालने के लिए, 3उदाहरण में n + 1 के साथ बदलें ।


-1
ls -la | awk '{o=$1" "$3; for (i=5; i<=NF; i++) o=o" "$i; print o }'

से इस उत्तर बुरा नहीं है, लेकिन प्राकृतिक रिक्ति चला गया है।
कृपया फिर इसकी तुलना इस से करें:

ls -la | cut -d\  -f4-

तब आपको अंतर दिखाई देगा।

यहां तक ​​कि उत्तरls -la | awk '{$1=$2=""; print}' पर आधारित मतदान सबसे अच्छा है, इस प्रकार प्रारूपण संरक्षित नहीं है।

इस प्रकार मैं निम्नलिखित का उपयोग करूंगा, और यह शुरुआत में स्पष्ट चयनात्मक कॉलम की अनुमति देता है:

ls -la | cut -d\  -f1,4-

ध्यान दें कि प्रत्येक स्थान कॉलम के लिए भी मायने रखता है, इसलिए नीचे दिए गए उदाहरण के लिए, कॉलम 1 और 3 खाली हैं, 2 INFO और 4 है:

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f1,3

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f2,4
INFO 2014-10-11
$

-1

यदि आप स्वरूपित पाठ चाहते हैं, तो अपने कमांड को प्रतिध्वनि के साथ चेन करें और अंतिम फ़ील्ड को प्रिंट करने के लिए $ 0 का उपयोग करें।

उदाहरण:

for i in {8..11}; do
   s1="$i"
   s2="str$i"
   s3="str with spaces $i"
   echo -n "$s1 $s2" | awk '{printf "|%3d|%6s",$1,$2}'
   echo -en "$s3" | awk '{printf "|%-19s|\n", $0}'
done

प्रिंटों:

|  8|  str8|str with spaces 8  |
|  9|  str9|str with spaces 9  |
| 10| str10|str with spaces 10 |
| 11| str11|str with spaces 11 |

-9

340 वोटों के साथ एक गलत तरीके से सबसे ज्यादा उकेरी गई एवेज़र की वजह से, मैंने अपने जीवन के 5 मिनट खो दिए! क्या किसी ने इस उत्तर को उखाड़ने से पहले कोशिश की? स्पष्ट रूप से नहीं। पूरी तरह से बेकार।

मेरे पास एक लॉग है जहां $ 5 के बाद एक आईपी पते के साथ अधिक पाठ या कोई पाठ नहीं हो सकता है। मुझे आईपी पते से लाइन के अंत तक सब कुछ चाहिए $ 5 के बाद कुछ भी होना चाहिए। मेरे मामले में, यह एक awk प्रोग्राम है, जो कि awk oneliner नहीं है, इसलिए इस समस्या को हल करना चाहिए। जब मैं सबसे अधिक उत्क्रमित लेकिन पूरी तरह से गलत उत्तर का उपयोग करके पहले 4 क्षेत्रों को हटाने की कोशिश करता हूं:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218" | awk '{$1=$2=$3=$4=""; printf "[%s]\n", $0}'

यह गलत और बेकार प्रतिक्रिया करता है (मैंने प्रदर्शित करने के लिए [..] जोड़ा):

[    37.244.182.218 one two three]

इस गलत उत्तर के साथ रूट को संयोजित करने के लिए कुछ सक्सेशन भी हैं। जैसे कि जटिलता एक सुधार है।

इसके बजाय, यदि कट प्वाइंट और awk तक कॉलम की चौड़ाई निश्चित है, तो सही उत्तर है:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218" | awk '{printf "[%s]\n", substr($0,28)}'

जो वांछित उत्पादन का उत्पादन करता है:

[37.244.182.218 one two three]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.