Я тоже бился головой над этим вопросом.
Я использовал 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
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 -e s/:/,/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
Вот моя попытка 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
:
на "," 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
Пояснение:
@F
. Массив индексируется от 0
до $#F
. Итак, $#F-1
— предпоследний элемент. :
, и эти разделенные поля приходят на место последнего элемента. ,
и затем печатается в 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