将列转换为bash中的行

时间:2013-09-10 09:16:17

标签: bash transpose

我有以下bash命令:

df -htgfs | awk '{print $5,$4}'| grep "^/"

给我以下输出:

/VAULT10 48%
/VAULT11 39%
/VAULT12 59%
/VAULT13 48%
/VAULT14 38%

但是,我希望它采用以下格式:

/VAULT10 /VAULT11 /VAULT12 /VAULT13 /VAULT14  
48% 39% 59% 48% 38%

但是我不确定如何在bash中轻松实现它(可以是空格,制表符或逗号分隔,它最终只会被复制/粘贴到excel电子表格中)。

为清楚起见,原始df -htgfs输出如下(此框运行GFS磁盘群集)。

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/pool_gfs-pool_gfs
                      506G  368G  138G  73% /VAULT10
/dev/mapper/pool_gfs1-pool_gfs1
                      506G  202G  304G  40% /VAULT11
/dev/mapper/pool_gfs2-pool_gfs2
                      506G  200G  306G  40% /VAULT12
/dev/mapper/pool_gfs3-pool_gfs3
                      506G  260G  246G  52% /VAULT13
/dev/mapper/pool_gfs4-pool_gfs4
                      506G  237G  269G  47% /VAULT14

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

awk可以解决这个问题:

df -htgfs | awk '$5~/^\//{name=name sep $5; size=size sep $4; sep=","} END{print name; print size}'

答案 1 :(得分:1)

Perl救援:

df -h | perl -lane \
    'push @n,$F[-1] and push @p, $F[-2] if $#F and $F[-1] =~ m{^/} }{ $, = "\t"; print @n; print @p'

答案 2 :(得分:0)

用于转置文件的通用解决方案,仅限Bash。 文件内容一行一行地进入数组 以另一种顺序写出来。

declare -a array                    # file content
IFS=' '                             # use $'\t' for tabs
ROWS=0                              # counts rows
COLS=0                              # counts columns

while read -a line ; do
  array+=( ${line[@]} )
  ((ROWS++))
done < "$infile"

COLS=$(( ${#array[@]}/ROWS ))       # get number of column

for (( row = 0; row < COLS; row++ )); do
  line=()
  for (( col = row; col < ROWS*COLS; col += COLS )); do
    line+=( ${array[col]} ) 
  done
  printf "%s\n" "${line[*]}" 
done