使用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欢迎你。用便携版本更新了我的帖子。