2016-09-20 119 views
0

我很困惑。shell脚本列结果列

我有这样一个值输出:

jstat -gc 7110 

S0C S1C S0U S1U  EC  EU  OC   OU  PC  PU YGC  YGCT FGC FGCT  GCT 
52416.0 52416.0 178.1 0.0 419456.0 261407.3 524288.0 30663.4 50272.0 30745.7 898 10.393 6  0.243 10.636 

我已经检索到的每一个关键和价值,而只是想显示类似的结果:

SOC : 52416.0 
S1C : 52416.0 

帮助!我的代码:

jstat -gc 7110 | tr -s '' | cut -d '' -f 1,14 | while read line 
do 
#echo $line 
lineinfo=(`echo $line | tr -s '' | cut -d '' -f 1,15`) 
for ((i=0; i<${#lineinfo[@]}; i++)) 
do 
echo "$i" : ${lineinfo[i]} 
printf "%s\n" 
done 
done 
+0

恕我直言,这不是一个bash任务。使用python,ruby或任何其他具有字典/类似地图数据结构的语言。在10行代码之下,可读,可维护,并且 - 不像任何bash解决方案 - 甚至可以测试。只是说:) –

回答

1
$ cat ip.txt 
S0C S1C S0U S1U  EC  EU  OC   OU  PC  PU YGC  YGCT FGC FGCT  GCT 
52416.0 52416.0 178.1 0.0 419456.0 261407.3 524288.0 30663.4 50272.0 30745.7 898 10.393 6  0.243 10.636 

$ sed -E 's/\s+/\n/g' ip.txt | pr -2ts' : ' 
S0C : 52416.0 
S1C : 52416.0 
S0U : 178.1 
S1U : 0.0 
EC : 419456.0 
EU : 261407.3 
OC : 524288.0 
OU : 30663.4 
PC : 50272.0 
PU : 30745.7 
YGC : 898 
YGCT : 10.393 
FGC : 6 
FGCT : 0.243 
GCT : 10.636 

使用sed更换的空格与换行,然后使用pr样式输出

1

如果列匹配完美,你可以做这样的事情使用awk:

awk -v OFS=' : ' '{ for (i = 1; i <= NF; ++i) if (NR == 1) key[i] = $i; else val[i] = $i } 
END { for (i = 1; i <= NF; ++i) print key[i], val[i] }' file 

循环遍历每行上的字段,将键和值分配给单独的数组。读完两行后,打印组合输出。

print在每个字段之间插入输出字段分隔符OFS,因此将其设置为' : '以获得所需的输出。

1
awk -v OFS=: 'NR==1 {for(i=1;i<=NF;i++) a[i]=$i;next} {for(i=1;i<=NF;i++) print a[i],$i}' infile 
S0C:52416.0 
S1C:52416.0 
S0U:178.1 
S1U:0.0 
EC:419456.0 
EU:261407.3 
OC:524288.0 
OU:30663.4 
PC:50272.0 
PU:30745.7 
YGC:898 
YGCT:10.393 
FGC:6 
FGCT:0.243 
GCT:10.636 
+0

如果你遇到了设置'OFS'的麻烦,那么为什么要使用'printf'? –

+0

...如果您要使用'print',那么为什么不使用逗号? –

+0

@TomFenech,我更新了我的答案。最初我想到了'printf'格式,但后来想到将它留给OP。 +1给你也是。 –

0

tr两次,pr输出控制:

$ tr -s \ '\n' file | pr -2 -t -s" : " 
S0C : 52416.0 
S1C : 52416.0 
S0U : 178.1 
S1U : 0.0 
EC : 419456.0 
EU : 261407.3 
OC : 524288.0 
OU : 30663.4 
PC : 50272.0 
PU : 30745.7 
YGC : 898 
YGCT : 10.393 
FGC : 6 
FGCT : 0.243 
GCT : 10.636 

或者awkpr

$ awk '$1=$1' OFS="\n" file |pr -2 -t -s" : " 

即。 $1=$1重建记录,并且OFS="\n"将输出字段分隔符更改为换行符。 pr制作甜美的专栏。

+1

'tr -s'''\ n'