awk打印跳过一个字段

时间:2014-12-14 04:08:52

标签: awk

在类型为“”的情况下,不按顺序打印第3个字段,然后打印除第3个字段外的整行。

给定标签分隔的行a b c d e,我们的想法是打印ab<tab>c<tab>a<tab>b<tab>d<tab>e

设置$3=""似乎会导致后续的print语句丢失tab字段分隔符,因此不行。

# $1 = year $2 = movie
BEGIN {FS = "\t"} 
  type=="" {printf "%s\t%s\t", $2 $1,$3; $3=""; print}
  type!="" {printf "%s\t<%s>\t", $2 $1,type; print}
END {print ""} 

坚持使用for循环,因为解决方案会导致空白文件。

# $1 = year $2 = movie
BEGIN {FS = "\t"} 
  type=="" {printf "%s\t%s\t%s\t%s\t", $2 $1,$3,$1,$2; for (i=4; i<=NF;i++) printf "%s\t",$i}
  type!="" {printf "%s\t<%s>\t", $2 $1,type; print}
END {print ""} 

2 个答案:

答案 0 :(得分:1)

单程

awk '{$3=""}1' OFS="\t" infile|column -t

解释

  • {$3=""}将列设置为nil
  • 1与print相同,打印该行。 OFS =“\ t”set Output Field Separator Variable to tab, maybe you needn't it, next command列-t`再次制作格式。
  • column -t列出带有标签的列表。

答案 1 :(得分:1)

您需要将OFS设置为选项卡而不是默认的单个空白字符,并且您不希望将$3设置为银行字符,因为您将在{{1}之间获得2个选项卡}和$2

$4

$ cat tst.awk BEGIN {FS = OFS = "\t"} { if (type == "") { val = $3 for (i=3; i<NF; i++) { $i = $(i+1) } NF-- } else { val = "<" type ">" } print $2 $1, val, $0 } $ $ awk -f tst.awk file | tr '\t' '-' ba-c-a-b-d-e $ $ awk -v type="foo" -f tst.awk file | tr '\t' '-' ba-<foo>-a-b-c-d-e 显然只是添加了以显示标签的位置。

如果在您的awk中删除NF无法删除记录中的最后一个字段,请将其替换为|tr '\t' '-'