更新:Bash + Awk:打印第一个X(动态)列并始终列为最后一列

时间:2016-01-06 08:56:42

标签: bash awk

  #file test.txt

  a b c 5    
  d e f g h 7
  gg jj 2

说X = 3我需要这样的输出:

   #file out.txt
   a b c 5
   d e f 7
   gg jj 2

不是这个:

a b c 5
d e f 7
gg jj 2 2 <--- WRONG

我已经到了这个阶段:

cat test.txt | awk ' { print $1" "$2" "$3" "NF } '

2 个答案:

答案 0 :(得分:2)

如果您不确定字段总数,那么一个选项就是使用循环:

awk '{ for (i = 1; i <= 3 && i < NF; ++i) printf "%s ", $i; print $NF }' file

使用三元组可以避免循环:

awk '{ print $1, $2, (NF > 3 ? $3 OFS $NF : $3) }' file

这比the approach suggested by 123稍微冗长,但意味着你不会在有三个字段的行上留下尾随空白。 OFS是输出字段分隔符,默认情况下为空格,这是print在使用,时在字段之间插入的内容。

答案 1 :(得分:1)

使用$结合NF

cat test.txt | awk ' { print $1" "$2" "$3" "$NF } '