移动最后一列标题名称并放在所有行的第一列上

时间:2013-11-26 10:27:52

标签: sed awk grep

想要获得该示例中标题中的最后一列是“db5b”,并将其放入下一行的第一列。

输出:

                                  Filesystem utilization for db5b

/dev/hd4           3.00      2.87    5%     5728     1% /
/dev/hd2           7.00      2.79   61%    61845     9% /usr
/dev/hd9var        7.00      5.88   17%      861     1% /var
/dev/hd3           3.00      2.98    1%      205     1% /tmp

预期结果:

db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp

我使用它但无法弄清楚如何将db5b放在第一列:

awk '{print $3, $7}'

我想如果想用awk完成结果使用NF但不知道如何完成命令。

4 个答案:

答案 0 :(得分:2)

像这样,例如:

$ awk 'NR==1 {a=$NF} NR>1 && $0 {print a,$4,$7}' file
db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp

解释

    在第一行
  • NR==1 {a=$NF},将最后一个字段保存到var a
  • NR>1 && $0 {print a,$4,$7}在第一个带有一些数据之后的行上,打印该值以及第4和第7个字段。

对于像Vijay's这样的输入:

$ awk '/Filesystem/ {a=$NF} /^\// {print a,$4,$7}' file
db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp
db6b 5% /
db6b 61% /usr
db6b 17% /var
db6b 1% /tmp

答案 1 :(得分:1)

这个单行提供你想要的东西:

awk 'NR==1{t=$NF;next}$0{print t,$4,$NF}' file

修改

不同的标题:

awk 'NF==4{t=$NF;next}$0{print t,$4,$NF}' file

答案 2 :(得分:1)

awk '$4!~/%/ && NF>0{a=$NF;next}{print a,$4,$7}' your_file

测试:

> cat temp
                                  Filesystem utilization for db5b
/dev/hd4           3.00      2.87    5%     5728     1% /
/dev/hd2           7.00      2.79   61%    61845     9% /usr
/dev/hd9var        7.00      5.88   17%      861     1% /var
/dev/hd3           3.00      2.98    1%      205     1% /tmp
                                  Filesystem utilization for db6b
/dev/hd4           3.00      2.87    5%     5728     1% /
/dev/hd2           7.00      2.79   61%    61845     9% /usr
/dev/hd9var        7.00      5.88   17%      861     1% /var
/dev/hd3           3.00      2.98    1%      205     1% /tmp
> awk '$4!~/%/ && NF>0{a=$NF;next}{print a,$4,$7}' temp
db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp
db6b 5% /
db6b 61% /usr
db6b 17% /var
db6b 1% /tmp
> 

答案 3 :(得分:0)

如果你想要一些非awk: -

#!/usr/bin/env bash
set -x

while read -r
do
output=$(echo "${REPLY}" | tr -s ' ')
drive=$(echo "${output}" | cut -f7)
percent=$(echo "${output}" | cut -f4)

echo -e "db5b\t${percent}\t${drive}"
done < fs_utilisation

-e切换到echo可能只是bash,因此不可移植。如果是这样,我道歉;你必须检查。我之所以使用-e开关是因为它会解释\ t来为你提供字段之间的标签。