如何从命令输出中获取第二列?

如何从命令输出中获取第二列?

我的命令的输出类似于:

                                   N O D E   O U T P U T

THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT

   NODE FOOT-   NT11     
        NOTE

      3       20.00     
     11       20.00     
   1003       23.75     
   1011       23.75     
   2003       27.52     
   2011       27.52     
   3003       31.30     
   3011       31.30     
   4003       35.08     
   4011       35.08     
   5003       38.87     
   5011       38.87     
   6003       42.67     
   6011       42.67     
   7003       46.48     
   7011       46.48     
   8003       50.29     
   8011       50.29     
   9003       54.12     
   9011       54.12     
  10003       57.95     
  10011       57.95     
  11003       61.79     
  11011       61.79     
  12003       65.64     
  12011       65.64     
  13003       69.50     
  13011       69.50     
  14003       73.37     
  14011       73.37     
  15003       77.25     
  15011       77.25     
  16003       81.14

第一列始终是数字,我的目的是仅获取第二列,例如:

20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
.
.

我打算使用

# gawk -f nset_output.awk electric_thermal.dat
BEGIN{
}
{
               if($12~/NSET_OUTPUT/ ){
                   for(i=1;i <= 5; i++){
                       getline
                   }
                   x=$2

        print x >"nset_output.dat"

    }       

}

为了完成这一任务,但是,输出被搞乱了:(只有一个值 20.00)20.00

那么,如何获取第二列的值呢? (在我的例子中,我有 405 行对应 1 列的 405 个值)

答案1

假设检查第一列中的数字就足够了:

awk '$1 ~ /[0-9]/ { print $2 }' data.in >data.out

为了确保这只适用于该NSET_OUTPUT行之后的行,您可以执行如下操作:

sed '1,/NSET_OUTPUT/d' data.in | awk '$1 ~ /[0-9]/ { print $2 }' >data.out

这将删除之前的行NSET_OUTPUT并将其余行发送到awk脚本。


您的脚本只会输出一个数字,因为对于每一行输入,将查找NSET_OUTPUT,如果找到,则在从第二列获取数字之前跳过五行。

以下是固定版本你的脚本:

BEGIN { print_values = 0 }

$12 ~ /NSET_OUTPUT/ {
    for (i = 1; i <= 5; i++) {
        getline;
    }

    print_values = 1;
}

print_values == 1 {
    x = $2;
    print x >"nset_output.dat"
}

答案2

我们可以测试第一个字段是否以数字开头,然后打印第二个字段

awk '$1 ~ /^[0-9][0-9]*$/ { print $2}' electric_thermal.dat > nset_output.dat

这与您的源文件匹配并返回

20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
....

答案3

awk是你的朋友:

awk '$1 ~ /^[[:digit:]]+$/{print $2}' electric_thermal.dat >outfile

应该这样做

答案4

如果每次执行命令后仍然存在以上7行,则使用:

yourcommand | sed 1,7d | awk '{print $2}'

sed 1,7d将简单地隐藏前 7 行,这是您不需要的。awk将整理出您真正正在寻找的确切内容...

cat yourcommand_out | sed 1,7d | awk '{print $2}'
20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
35.08
35.08
38.87
38.87
42.67
42.67
46.48
46.48
50.29
50.29
54.12
54.12
57.95
57.95
61.79
61.79
65.64
65.64
69.50
69.50
73.37
73.37
77.25
77.25
81.14

相关内容