如果第2列为空,则将第4列的值分配给第2列,将第5列的值分配给第3列

时间:2016-11-18 16:16:57

标签: bash awk

我有一个文件

Field1 Field2 Field3 Field4 Field5
a1     a2     a3     a4     a5
b1                   b4     b5
c1     c2     c3     c4     c5
d1                   d4     d5
e1                   e4     e5

如果字段2为空,我想将字段4的值复制到字段2,将字段5的值复制到字段3。

所以预期的结果应该是

Field1 Field2 Field3 Field4 Field5
a1     a2     a3     a4     a5
b1     b4     b5     b4     b5
c1     c2     c3     c4     c5
d1     d4     d5     d4     d5
e1     e4     e5     e4     e5

我目前所拥有的是

awk -F, 'BEGIN {
   for (i = 1; i <= n; ++i) {
      if ($2=="") {$2=$7}
  print
   }
}' File > FileA 

但它根本不起作用......任何帮助都将受到赞赏!谢谢

EDIT1: 输入和输出文件都以逗号分隔,因此原始数据将是类似的 输入文件

a1,a2,a3,a4,a5
b1,,,b4,b5
c1,c2,c3,c4,c5
d1,,,d4,d5
e1,,,e4,e5

输出文件

a1,a2,a3,a4,a5
b1,b4,b5,b4,b5
c1,c2,c3,c4,c5
d1,d4,d5,d4,d5
e1,e4,e5,e4,e5

2 个答案:

答案 0 :(得分:4)

awk 'BEGIN{FS=OFS=","} $2=="" {$2=$4; $3=$5}1' file

从文件输入:

a1,a2,a3,a4,a5
b1,,,b4,b5
c1,c2,c3,c4,c5
d1,,,d4,d5
e1,,,e4,e5

输出到标准输出:

a1,a2,a3,a4,a5  
b1,b4,b5,b4,b5
c1,c2,c3,c4,c5
d1,d4,d5,d4,d5
e1,e4,e5,e4,e5

请参阅:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

答案 1 :(得分:0)

对于简单的逗号sepator:

awk -F\, '$2==""{$2=$4;$3=$5}1' OFS="," File

给出:

a1,a2,a3,a4,a5
b1,b4,b5,b4,b5
c1,c2,c3,c4,c5
d1,d4,d5,d4,d5
e1,e4,e5,e4,e5

原始问题是关于固定宽度字段,如下所示:

Field1 Field2 Field3 Field4 Field5
a1     a2     a3     a4     a5
b1                   b4     b5
c1     c2     c3     c4     c5
d1                   d4     d5
e1                   e4     e5

使用gawk

gawk 'BEGIN{FIELDWIDTHS="7 7 7 7 7"}
      $2 ~ /^ *$/{$2=$4;$3=$5}
      {split(sprintf($0),a)}{print a[1]"\t"a[2]"\t"a[3]"\t"a[4]"\t"a[5]}' File

<强>结果

Field1  Field2  Field3  Field4  Field5
a1      a2      a3      a4      a5
b1      b4      b5      b4      b5
c1      c2      c3      c4      c5
d1      d4      d5      d4      d5
e1      e4      e5      e4      e5
  

FIELDWIDTHS 以空格分隔的列列表,告诉gawk 如何   分割具有固定柱状边界的输入

检查docs