我有一个文件
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
答案 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。