2016-09-20 160 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'