Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用awk用前一行的字符填充空格_Awk_Whitespace - Fatal编程技术网

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

使用awk用前一行的字符填充空格,awk,whitespace,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) { fo

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

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
#/bin/bash
cat input.dat | awk'{if(FNR==1){

对于(i=1;i我认为您需要使用GNU awk和固定宽度输入解析,方法是在
BEGIN{}
块中设置
FIELDWIDTHS=“2”
。然后您将知道缺少哪个字段

但是,您的
-1
输入值可能会弄乱它,具体取决于它的间距,因此您可能需要先通过
sed
运行数据,以将
-1
替换为,比如说
2
,然后在
awk
完成后用另一个
sed
将其反转

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

使用
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 '{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

使用
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 '{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

在你的第三行输入中,$3将为空,而不是$2…你的意思是控制:if($i!=“”)不起作用吗?我刚刚复制了你的想法,cred to you:)@Anna欢迎你。用便携版本更新了我的帖子。