我有一个返回类似于;
的输出的命令*************
* 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字段?是否有这样的方法从右边打印而不是从左边计数字段的所有命令的默认值?
任何帮助都将不胜感激。
答案 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}
的动作部分。