我想解决以下问题。给定像这样的输入文件:
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
但它根本不起作用。你能帮助我吗?提前谢谢!
答案 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