Korn / Bash Shell: Как мне конвертировать содержимое в приведенный ниже формат?

pid name tid mod state data -------------------------------------------------------------------------------- 39523 srv0051_0001_0 39642 20-10:59:28 Working 820000:500196:500077 43137 srv0051_0005_0 43156 20-10:59:28 Working 820000:4250501:840057 43895 srv0051_0006_0 43903 20-10:59:28 Working 820000:4250501:840057 47523 srv0051_0009_0 47547 20-10:59:28 Working 600005:4250501:4250846 48841 srv0051_0010_0 48851 20-10:59:28 Working 600005:4290000:4290000 58182 srv0051_0020_0 58188 20-10:59:28 Working 820000:4250501:840057 8297 srv0079_0008_0 8316 20-10:59:27 Working 600005:3070001:3050012 pid,name,tid,mod,state,appnbr,request,tasknbr,appctx,username 39523,srv0051_0001_0,39642,20-10:59:28,Working,820000,500196,500077 43137,srv0051_0005_0,43156,20-10:59:28,Working,820000,4250501,840057 43895,srv0051_0006_0,43903,20-10:59:28,Working,820000,4250501,840057 47523,srv0051_0009_0,47547,20-10:59:28,Working,600005,4250501,4250846 48841,srv0051_0010_0,48851,20-10:59:28,Working,600005,4290000,4290000 58182,srv0051_0020_0,58188,20-10:59:28,Working,820000,4250501,840057 8297,srv0079_0008_0,8316,20-10:59:27,Working,600005,3070001,3050012 

 sed ' # delete the 2nd line 2d # remove any leading whitespace s/^[[:blank:]]\+// # on line 1, replace "data" with other words 1s/data/appnbr request tasknbr appctx username/ # replace any sequences of whitespace with comma s/[[:blank:]]\+/,/g # replace the 3rd and subsequent colons s/:/,/3g ' file 

Требуется GNU sed для действия s///3g

Попробуй это

 grep -v "^-" test.txt | tr -s " " ',' | sed -es/:/,/3g -e '0,/data/ s/data/appnbr,request,tasknbr,appctx,username/' 
 $ awk -f script.awk file.txt pid,name,tid,mod,state,appnbr,request,tasknbr,appctx,username 39523,srv0051_0001_0,39642,20-10:59:28,Working,820000,500196,500077 43137,srv0051_0005_0,43156,20-10:59:28,Working,820000,4250501,840057 43895,srv0051_0006_0,43903,20-10:59:28,Working,820000,4250501,840057 47523,srv0051_0009_0,47547,20-10:59:28,Working,600005,4250501,4250846 48841,srv0051_0010_0,48851,20-10:59:28,Working,600005,4290000,4290000 58182,srv0051_0020_0,58188,20-10:59:28,Working,820000,4250501,840057 8297,srv0079_0008_0,8316,20-10:59:27,Working,600005,3070001,3050012 

Где script.awk

 BEGIN { OFS = "," } # set output delimiter NR == 1 { # modify some fields of the header $6 = "appnbr" $7 = "request" $8 = "tasknbr" $9 = "appctx" $10 = "username" } NR == 2 { next } # skip line 2 NR > 2 { # split the sixth field on ":" and extend the record with the bits split($6, a, ":") $6 = a[1] $7 = a[2] $8 = a[3] } 1 # print 
 perl -lane 'print join ",", @F[0..$#F-1], $. == 1 ? qw/appnbr request tasknbr appctx username/ : split /:/, $F[-1] unless $. == 2' input-file.txt 

Выход:

 id,name,tid,mod,state,appnbr,request,tasknbr,appctx,username 39523,srv0051_0001_0,39642,20-10:59:28,Working,820000,500196,500077 43137,srv0051_0005_0,43156,20-10:59:28,Working,820000,4250501,840057 43895,srv0051_0006_0,43903,20-10:59:28,Working,820000,4250501,840057 47523,srv0051_0009_0,47547,20-10:59:28,Working,600005,4250501,4250846 48841,srv0051_0010_0,48851,20-10:59:28,Working,600005,4290000,4290000 58182,srv0051_0020_0,58188,20-10:59:28,Working,820000,4250501,840057 8297,srv0079_0008_0,8316,20-10:59:27,Working,600005,3070001,3050012 

Объяснение:

  1. Разделите каждую строку, иначе, запись, на пробел (ы) и сохраните получающиеся поля в массиве @F . Массив индексируется от 0 и доходит до $#F Таким образом, $#F-1 является вторым последним элементом.
  2. Все строки, кроме 2-й, должны быть обработаны, так как последний элемент является решающим фактором.
  3. Для первой строки последний элемент заменяется несколькими именами полей.
  4. Для остальных (помните, что 2-й уже отброшен) разделены на : и эти разделенные поля приходят на место последнего элемента.
  5. Объединение всех элементов выполняется , а затем выводится на стандартный stdout .

С помощью POSIX sed мы можем сделать следующее:

 sed -e ' 2d s/^[[:blank:]]*//;s/[[:blank:]]*$//;s/[[:blank:]]\{1,\}/ /g ;# trim n squeeze blanks 1s/data$/appnbr request tasknbr appctx username/ ;# line 1 spl processing y/:/\n/ ;# change all colons to newlines s/\n/:/;s//:/ ;# undo the transformation for the first 2 y/\n/ / ;# change the rest to blanks y/ /,/ ;# now change these and the already existing blanks to commas ' input-file.txt 

Вот мой удар по нему.

 awk 'BEGIN{print "id,name,tid,mod,state,appnbr,request,tasknbr,appctx,username"}NR>2{print $1","$2","$3","$4","$5","gensub(/:/,",","g",$6)}' file.txt 
  • NR> 2, так что записи № 1 и 2 (заголовки) пропускаются
  • печать полей от 1 до 5 с запятыми
  • вместо печати поля $ 6 выведите его с помощью : замените на «,»