按列和可变行字段打印字段

时间:2017-01-05 22:50:19

标签: awk

我有一个返回类似于;

的输出的命令
*************
* something *
*************

                                                     |     Header    |  Title  |
Column1|Column2         | Column3  |Column4| Column5 |Column6|Column7| Column8 |
--------------------------------------------------------------------------------
val1    val2             val3       x y      i j      1(a) 2  1(a) 2  val4
val5    val6             val7       w x y z  i j k    2(b) 2  1(b) 1  val8
..
..

Total lines: xx

我想打印column6例如,但因为输出不是空格的固定变量字段,awk '{print $x}'对我来说不起作用。我需要一种通过定义列(例如Column6或Column8)打印输出的方法。也许从右边打印column6字段,右边是$ 5字段?是否有这样的方法从右边打印而不是从左边计数字段的所有命令的默认值?

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

将<{1}}用于此

NF

这将打印第6列到最后一列,例如

答案 1 :(得分:0)

我一直在解决类似的问题。假设Column6始终存在,您可以使用后面的冒号来查找索引

echo "Column1|Column2|Column6|Column8" | sed 's/Column6.*//;s/[^|]\+//g' | wc -c

然后你可以简单地构造awk查询

X=$(echo ...)
SCRIPT="{ print \$${X}; }"
echo "Column1 |Column2 |Column6 |Column8" | awk "${SCRIPT}"
|Column6

答案 2 :(得分:0)

重写在Gnu awk:

$ cat program.awk
BEGIN  { FS="|" }
$0 ~ c {                                # process record with header
    split($0,a,"|")                     # split to get header indexes
    for(i in a) {                       # loop all column names
        gsub(/^ *| *$/,"",a[i])         # trim space off
        if(a[i]==c) ci=i                # ci is the one              
    }
    while(i=index($0,FS)) {             # form FIXEDWIDTHS to separate fields
        FIELDWIDTHS = FIELDWIDTHS i " "
        $0=substr($0,i+1)
    }
}
ci && $ci !~ /^-+$/ && $0=$ci           # implicit printing

运行它:

$ awk -v c="Column6" -f program.awk file
1(a) 2  
2(b) 2  

如果您要修改输出列,program.awk中的最后一行就是这样做的地方。例如,让我们假设你想要松开Column6的括号部分,你可以为它创建一个带有{sub(/\(.*\)/,""); print}的动作部分。