使用awk填充前一行字符的空格

时间:2014-07-01 21:26:15

标签: awk whitespace

我想解决以下问题。给定像这样的输入文件:

1 1 1
1 0 1
1   1
0
1

我想用相同列但前一行的字符替换每个空格。该过程必须继续,直到所有列都具有与具有最大长度的列相同数量的非空元素。第一行不包含空白字符,元素可以是0,1或-1。 在那个例子中,我想有这个输出文件:

1 1 1
1 0 1
1 0 1
0 0 1
1 0 1

我试过写这个脚本:

#! /bin/bash

cat input.dat | awk '{if(FNR == 1) {
            for(i=1; i<=NF; i++)
                first[i] = $i;
            max = NF;
            print $0
            }  else {
            for(i=1; i<=max; i++) {
                if($i != "")
                    second[i] = $i;
            }
            for(i=1; i<=max; i++) {
                if($i == "")
                    printf("%d\t", first[i])
                else {
                    printf("%d\t", second[i])   
                    first[i] = second[i];
                }
            }
            printf("\n");
            }
        }' > output.dat

但它根本不起作用。你能帮助我吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你需要在FIELDWIDTHS="2 2 2"块中设置BEGIN{}来使用GNU awk和固定宽度输入解析。然后你就会知道缺少哪个领域。

但是,您的-1输入值可能会混淆,具体取决于其间隔方式,因此您可能需要首先通过sed运行数据,将-1替换为2。 {1}}然后在sed完成后用另一个awk将其反转。

sed 's/-1/2/g' file | awk ... | sed 's/2/-1/g'

答案 1 :(得分:0)

使用gnu awk

awk -v FIELDWIDTHS="1 1 1 1 1" '$3!~/0|1/ {$3=p3} $5!~/0|1/ {$5=p5} {p3=$3;p5=$5;print $1,$3,$5}'
1 1 1
1 0 1
1 0 1
0 0 1
1 0 1

使用awk

的更便携版本
awk '{f1=substr($0,1,1);f2=substr($0,3,1);f3=substr($0,5,1)} f2!~/0|1/ {f2=p2} $3!~/0|1/ {f3=p3} {p2=f2;p3=f3;print f1,f2,f3}' file
1 1 1
1 0 1
1 0 1
0 0 1
1 0 1