awk打印跳过字段
在类型为“”的情况下,按顺序打印第三个字段,然后打印除第三个字段外的整行 给定一个以制表符分隔的行awk打印跳过字段,awk,Awk,在类型为“”的情况下,按顺序打印第三个字段,然后打印除第三个字段外的整行 给定一个以制表符分隔的行a b c d e的想法是打印abcabde 设置$3=“”似乎会导致后续打印语句丢失选项卡字段分隔符,因此不好 # $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,ty
a b c d e
的想法是打印abcabde
设置$3=“”
似乎会导致后续打印语句丢失选项卡字段分隔符,因此不好
# $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 ""}
#$1=年份$2=电影
开始{FS=“\t”}
type==“{printf”%s\t%s\t“,$2$1,$3;$3=”“;print}
打字=“{printf”%s\t\t“,$2$1,键入;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 ""}
#$1=年份$2=电影
开始{FS=“\t”}
type==“{printf”%s\t%s\t%s\t%s\t%s\t“,$2$1,$3$1,$2;用于(i=4;i单向
awk '{$3=""}1' OFS="\t" infile|column -t
解释
{$3=”“}
将列设置为零
1
与打印相同,打印行。
OFS=“\t”将输出字段分隔符变量设置为tab,也许您不需要它,下一个命令column-t`重新设置格式
column-t
使用选项卡列化列表
您需要将OFS设置为选项卡,而不是默认的单个空白字符,并且您不希望只将$3
设置为银行字符,因为这样您将得到介于$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
$cat tst.awk
开始{FS=OFS=“\t”}
{
如果(类型==“”){
瓦尔=3美元
对于(i=3;我不理解,但接受了它,因为它让我阅读了我确实理解的内容。当字段中有空白字符并且列-t
没有任何用处时,这将失败。问题是,如果你有时间,你可以像你一样将其完善。启发性的观察。我宁愿处理doubl使用后运行tr的选项卡,而不是将for循环插入awk。@IheOnwuka则无法区分最初为空的字段和由于设置$3=“”而变为空的字段
所以你会破坏你的输出。因为我控制了$3的内容,所以我不担心这个问题,但我同意其他人也是如此。$3
的值不是主要问题,而是其他字段的值。看,用一个命令修改你的文本,然后将其传输到d,这只是一个简单的老坏主意尝试更正您在第一个命令中引入的任何问题的不同命令。当然,按照您喜欢的方式执行。您不希望在会导致大量修复的情况下执行此操作,但这并不是一个普遍的坏主意。远非如此。在我的示例中,肯定不太清楚为什么必须使用for循环,而运行tr是一个后验方法这是对单个程序员的一种判断。做出一个让你几乎达到目的的初始动作,并应用任何必要的修正是一种有效的设计技巧,尤其是当你做的初始事情相对简单时。