在类型为“”的情况下,不按顺序打印第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 ""}
答案 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' '-'
。