使用awk重新格式化表

时间:2017-05-05 07:27:39

标签: bash awk

我有这张桌子,

ID ref1 ref2
a   1   3
b   3   1
c   5   1
d   2   4

选项卡分隔,并且有n个ID(a,b,c,..)和引用(ref1,ref2,...等等)。如果大于2,我想用相应的ID替换数字,所以所需的输出将是,

ref1 ref2
b     a
c     d

我已经为awk

的单列做了事
awk -F "\t" '{if($2>2) print $1}' filename

awk 'BEGIN{OFS=FS="\t"}$2>2{$2=$1}{print}' filename

但是我不能将它们用于更大的文件。

非常感谢任何帮助,谢谢。

的Vivek

1 个答案:

答案 0 :(得分:1)

好尝试!

您只需要遍历Awk中从$2NF的所有列,即最后一个字段并进行替换,

awk 'BEGIN{FS=OFS="\t"}NR>1{for(i=2;i<=NF;i++) if ($i>2) $i=$1}1' file

NR>1应跳过处理标题行并保持原样。 {}1构造相当于用于打印行的始终为真条件,而不是在子句中使用{print},在这种情况下,您将打印限制为仅在内部定义的条件{..}

根据OP在评论中的需要,如果应为不匹配的条目更新"NIL",请通过

进行修复
awk 'BEGIN{FS=OFS="\t"}NR>1{for(i=2;i<=NF;i++) if ($i>2) { $i=$1 } else { $i="NIL" } }1'