awk使用以前的非空列值填充空列值:
要读取第一列,然后用以前的非空列值向下填充空列值 Input.txtawk使用以前的非空列值填充空列值:,awk,Awk,要读取第一列,然后用以前的非空列值向下填充空列值 Input.txt 20 0 ABC 1 N DEFABC 0 CHARGE 1 ABC 1 N GHIABC 0 CHARGE 2 ABC 1 N JKLA
20 0 ABC 1 N DEFABC 0 CHARGE
1 ABC 1 N GHIABC 0 CHARGE
2 ABC 1 N JKLABC 0 CHARGE
3 ABC 1 N MNOABC 0 CHARGE
4 ABC 1 N PQRABC 0 CHARGE
210&&-2 0 ABC 1 N DEFABC 0 CHARGE
1 ABC 1 N GHIABC 0 CHARGE
2 ABC 1 N JKLABC 0 CHARGE
3 ABC 1 N MNOABC 0 CHARGE
4 ABC 1 N PQRABC 0 CHARGE
2130&&-4&-6&&-9 0 ABC 1 N DEFABC 0 CHARGE
1 ABC 1 N GHIABC 0 CHARGE
2 ABC 1 N JKLABC 0 CHARGE
3 ABC 1 N MNOABC 0 CHARGE
4 ABC 1 N PQRABC 0 CHARGE
已经尝试了下面的命令脚本,如果文件分离,它工作正常
对于上述示例输入,它不适用于FS=“”和FS=“\t”
$ awk -f FillEmpty.awk Input.txt
$ cat FillEmpty.awk
BEGIN { FS = "" }
$1 != "" { print }
$1 == "" {
# fill in blanks
for (i = 1; i <= NR; i++)
if ($i == "")
$i = Saved[i]
print
}
{
# save all fields
for (i = 1; i <= NR; i++)
Saved[i] = $i
}
任何建议 您可以使用:
awk 'NF==8{m=$1}NF!=8{$0=m$0}1' the.file
但是,它会破坏输出格式 这适用于固定宽度:
awk 'substr($0,0,24) ~ $1 { f=$1 }{ $0=f substr($0, length(f)+1) } 1' file
如果第一列中有内容,请将值保存到f
。无论哪种方式,都要将值替换到行中。末尾的1
确保打印该行
测试它:
$ awk 'substr($0,0,24) ~ $1 { f=$1 }{ $0=f substr($0, length(f)+1) } 1' file
20 0 ABC 1 N DEFABC 0 CHARGE
20 1 ABC 1 N GHIABC 0 CHARGE
20 2 ABC 1 N JKLABC 0 CHARGE
20 3 ABC 1 N MNOABC 0 CHARGE
20 4 ABC 1 N PQRABC 0 CHARGE
210&&-2 0 ABC 1 N DEFABC 0 CHARGE
210&&-2 1 ABC 1 N GHIABC 0 CHARGE
210&&-2 2 ABC 1 N JKLABC 0 CHARGE
210&&-2 3 ABC 1 N MNOABC 0 CHARGE
210&&-2 4 ABC 1 N PQRABC 0 CHARGE
2130&&-4&-6&&-9 0 ABC 1 N DEFABC 0 CHARGE
2130&&-4&-6&&-9 1 ABC 1 N GHIABC 0 CHARGE
2130&&-4&-6&&-9 2 ABC 1 N JKLABC 0 CHARGE
2130&&-4&-6&&-9 3 ABC 1 N MNOABC 0 CHARGE
2130&&-4&-6&&-9 4 ABC 1 N PQRABC 0 CHARGE
保留格式的Awk方式
awk '/^ /{$0=(x)substr($0,21)}{x=substr($0,0,20)}1' file
另一种不需要字段长度的方法(非常类似于tom feneches的答案)
两者的输出
20 0 ABC 1 N DEFABC 0 CHARGE
20 1 ABC 1 N GHIABC 0 CHARGE
20 2 ABC 1 N JKLABC 0 CHARGE
20 3 ABC 1 N MNOABC 0 CHARGE
20 4 ABC 1 N PQRABC 0 CHARGE
210&&-2 0 ABC 1 N DEFABC 0 CHARGE
210&&-2 1 ABC 1 N GHIABC 0 CHARGE
210&&-2 2 ABC 1 N JKLABC 0 CHARGE
210&&-2 3 ABC 1 N MNOABC 0 CHARGE
210&&-2 4 ABC 1 N PQRABC 0 CHARGE
2130&&-4&-6&&-9 0 ABC 1 N DEFABC 0 CHARGE
2130&&-4&-6&&-9 1 ABC 1 N GHIABC 0 CHARGE
2130&&-4&-6&&-9 2 ABC 1 N JKLABC 0 CHARGE
2130&&-4&-6&&-9 3 ABC 1 N MNOABC 0 CHARGE
2130&&-4&-6&&-9 4 ABC 1 N PQRABC 0 CHARGE
输出:
20 0 ABC 1 N DEFABC 0 CHARGE
20 1 ABC 1 N GHIABC 0 CHARGE
20 2 ABC 1 N JKLABC 0 CHARGE
20 3 ABC 1 N MNOABC 0 CHARGE
20 4 ABC 1 N PQRABC 0 CHARGE
210&&-2 0 ABC 1 N DEFABC 0 CHARGE
210&&-2 1 ABC 1 N GHIABC 0 CHARGE
210&&-2 2 ABC 1 N JKLABC 0 CHARGE
210&&-2 3 ABC 1 N MNOABC 0 CHARGE
210&&-2 4 ABC 1 N PQRABC 0 CHARGE
2130&&-4&-6&&-9 0 ABC 1 N DEFABC 0 CHARGE
2130&&-4&-6&&-9 1 ABC 1 N GHIABC 0 CHARGE
2130&&-4&-6&&-9 2 ABC 1 N JKLABC 0 CHARGE
2130&&-4&-6&&-9 3 ABC 1 N MNOABC 0 CHARGE
2130&&-4&-6&&-9 4 ABC 1 N PQRABC 0 CHARGE
类似于我的
awk'a=/^/{$0=x$0}!一个{x=$1}1'文件
@Jidder Yours看起来更好(因为它是通用的,不依赖于字段计数8),这样就省去了0条记录。我想这是因为下一次跳过了它创造的记录。@Jidder发现得很好!修正了。+1,我正在删除我的,因为你们的非常相似,只需完全去掉a
变量,因为它并没有增加任何值。@EdMorton我该如何去掉a?如果您认为我的答案可以改进,请随意编辑。只需删除a
的所有分配和测试,例如:awk'/^/{$0=x substr($0,21)}{x=substr($0,0,20)}1'文件
20 0 ABC 1 N DEFABC 0 CHARGE
20 1 ABC 1 N GHIABC 0 CHARGE
20 2 ABC 1 N JKLABC 0 CHARGE
20 3 ABC 1 N MNOABC 0 CHARGE
20 4 ABC 1 N PQRABC 0 CHARGE
210&&-2 0 ABC 1 N DEFABC 0 CHARGE
210&&-2 1 ABC 1 N GHIABC 0 CHARGE
210&&-2 2 ABC 1 N JKLABC 0 CHARGE
210&&-2 3 ABC 1 N MNOABC 0 CHARGE
210&&-2 4 ABC 1 N PQRABC 0 CHARGE
2130&&-4&-6&&-9 0 ABC 1 N DEFABC 0 CHARGE
2130&&-4&-6&&-9 1 ABC 1 N GHIABC 0 CHARGE
2130&&-4&-6&&-9 2 ABC 1 N JKLABC 0 CHARGE
2130&&-4&-6&&-9 3 ABC 1 N MNOABC 0 CHARGE
2130&&-4&-6&&-9 4 ABC 1 N PQRABC 0 CHARGE
awk '/^[ \t]/ { sub(/^[ \t]+/, ""); print t $0; next }
{ match($0, /^[^ \t]+[ \t]+/); t = substr($0, RSTART, RLENGTH) }
1' file
20 0 ABC 1 N DEFABC 0 CHARGE
20 1 ABC 1 N GHIABC 0 CHARGE
20 2 ABC 1 N JKLABC 0 CHARGE
20 3 ABC 1 N MNOABC 0 CHARGE
20 4 ABC 1 N PQRABC 0 CHARGE
210&&-2 0 ABC 1 N DEFABC 0 CHARGE
210&&-2 1 ABC 1 N GHIABC 0 CHARGE
210&&-2 2 ABC 1 N JKLABC 0 CHARGE
210&&-2 3 ABC 1 N MNOABC 0 CHARGE
210&&-2 4 ABC 1 N PQRABC 0 CHARGE
2130&&-4&-6&&-9 0 ABC 1 N DEFABC 0 CHARGE
2130&&-4&-6&&-9 1 ABC 1 N GHIABC 0 CHARGE
2130&&-4&-6&&-9 2 ABC 1 N JKLABC 0 CHARGE
2130&&-4&-6&&-9 3 ABC 1 N MNOABC 0 CHARGE
2130&&-4&-6&&-9 4 ABC 1 N PQRABC 0 CHARGE