मेरे पास स्क्रिप्ट है जो कुछ फ़ाइल को पकड़ती है और मान प्रिंट करती है, लेकिन यह नीचे की तरह लंबवत आती है

size=190000
date=1603278566981
repo-name=testupload
repo-path=/home/test/testupload
size=140000
date=1603278566981
repo-name=testupload2
repo-path=/home/test/testupload2
size=170000
date=1603278566981
repo-name=testupload3
repo-path=/home/test/testupload3

मैं चाहता हूं कि यह नीचे की तरह प्रिंट होना चाहिए

size    date            repo-name          repo-path
190000  1603278566981   testupload      /home/test/testupload
140000  1603278566981   testupload2     /home/test/testupload2
170000  1603278566981   testupload3     /home/test/testupload3

मैंने नीचे की तरह चीजों की कोशिश की लेकिन यह काम नहीं करता है

awk

वैसे भी मैं इसे नीचे की तरह स्वरूपित तरीके से क्षैतिज रूप से प्रिंट कर सकता हूं:

size    date            repo-name          repo-path
190000  1603278566981   testupload      /home/test/testupload
140000  1603278566981   testupload2     /home/test/testupload2
170000  1603278566981   testupload3     /home/test/testupload3

कृपया सुझाव दें और मदद करें

2
Samurai 30 नवम्बर 2020, 08:43

2 जवाब

सबसे बढ़िया उत्तर

क्या आप जीएनयू awk में दिखाए गए नमूनों के साथ निम्नलिखित, लिखित और परीक्षण करने का प्रयास कर सकते हैं।

awk '
BEGIN{ FS="=" }
/^size/{
  if(++count1==1){ header=$1 }
  sizeArr[++count]=$NF
  next
}
/^date/{
  if(++count2==1){ header=header OFS $1 }
  dateArr[count]=$NF
  next
}
/^repo-name/{
  if(++count3==1){ header=header OFS $1 }
  repoNameArr[count]=$NF
  next
}
/^repo-path/{
  if(++count4==1){ header=header OFS $1 }
  repopathArr[count]=$NF
  next
}
END{
  print header
  for(i=1;i<=count;i++){
    printf("%s %s %s %s\n",sizeArr[i],dateArr[i],repoNameArr[i],repopathArr[i])
  }
}
' Input_file | column -t

स्पष्टीकरण: ऊपर के लिए विस्तृत विवरण जोड़ना।

awk '                                        ##Starting awk program from here.
BEGIN{ FS="=" }                              ##Starting BEGIN section from here and setting field separator as = here.
/^size/{                                     ##If line starts from size then do following.
  if(++count1==1){ header=$1 }               ##Checking if count1 variable is 1 then setting 1st field value as header.
  sizeArr[++count]=$NF                       ##Creating sizeArr with increasing count with 1 as an index and value is last field.
  next                                       ##next will skip all further statements.
}
/^date/{                                     ##If line starts from date then do
  if(++count2==1){ header=header OFS $1 }    ##Checking if count2 variable is 1 then setting 1st field value as header.
  dateArr[count]=$NF                         ##Creating dateArr with count as an index and value is last field.
  next                                       ##next will skip all further statements.
}
/^repo-name/{                                ##If line starts from repo-name then do
  if(++count3==1){ header=header OFS $1 }    ##Checking if count3 variable is 1 then setting 1st field value as header.
  repoNameArr[count]=$NF                     ##Creating repoNameArr with count as an index and value is last field.
  next                                       ##next will skip all further statements.
}
/^repo-path/{                                ##If line starts from repo-path then do
  if(++count4==1){ header=header OFS $1 }    ##Checking if count4 variable is 1 then setting 1st field value as header.
  repopathArr[count]=$NF                     ##Creating repopathArr with count as an index and value is last field.
  next                                       ##next will skip all further statements.
}
END{                                         ##Starting END block of this program from here.
  print header                               ##Printing header here.
  for(i=1;i<=count;i++){                     ##Starting loop from 1 to value of count.
    printf("%s %s %s %s\n",sizeArr[i],dateArr[i],repoNameArr[i],repopathArr[i]) ##Printing all array values here with index as i here.
  }
}
' Input_file | column -t                     ##mentioning Input_file name and sendig awk output to column command for better looks.
4
RavinderSingh13 30 नवम्बर 2020, 09:21

मान लें कि इनपुट फ़ील्ड अनुक्रम स्थिर है यहाँ mawk संस्करण 1.3.4 के लिए एक संस्करण है:

awk -v RS='size=' -v OFS='\t' '
BEGIN{ fmt = "%s" OFS "%s" OFS "%s" OFS" %s" ORS }
function h(s) { return substr(s,1,index(s,"=")-1) }
function v(s) { return substr(s,1+index(s,"=")) }
NF{ if (!hdr++)
        printf(fmt,h(RS),h($2),h($3),h($4))
    printf(fmt,$1,v($2),v($3),v($4))
}
' data | column -t

... हालांकि RS='(^|\n)size=' का उपयोग करना और उसके अनुसार पहले शीर्षलेख विशेषता को संपादित करना अधिक सुरक्षित है।

आउटपुट:

size    date           repo-name    repo-path
190000  1603278566981  testupload   /home/test/testupload
140000  1603278566981  testupload2  /home/test/testupload2
170000  1603278566981  testupload3  /home/test/testupload3
0
urcodebetterznow 30 नवम्बर 2020, 14:19