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

Я тоже бился головой над этим вопросом.

Я использовал virtualbox.repo с CentOS 7

Вот что у меня получилось:

# yum remove VirtualBox-5.0
# yum -y update kernel kernel-firmware
# yum -y install kernel-devel
# yum -y install epel-release
# yum -y install dkms
# yum -y install VirtualBox-5.0
1
25.06.2018, 22:53
5 ответов
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

6
27.01.2020, 23:11

Попробуйте это

grep -v "^-" test.txt | tr -s " " ',' |  sed -e s/:/,/3g -e '0,/data/ s/data/appnbr,request,tasknbr,appctx,username/'
2
27.01.2020, 23:11
$ 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
1
27.01.2020, 23:11

Вот моя попытка awk.

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 напечатайте его, заменив :на ","
1
27.01.2020, 23:11
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. Разделите каждую строку, также известную как запись, на пробелы (s )и сохраните полученные поля в массиве @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
1
27.01.2020, 23:11

Теги

Похожие вопросы