想要读取第一列,然后使用“上一个非空列值”向下填充“空列值”。
INPUT.TXT
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
}
期望的输出:
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
任何建议......!
答案 0 :(得分:4)
保存格式的awk方法
awk '/^ /{$0=(x)substr($0,21)}{x=substr($0,0,20)}1' file
另一种方式,不需要字段的长度(非常类似汤姆feneches答案)
awk '/^ /{$0=(x)substr($0,length(x)+1)}{x=$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
答案 1 :(得分:1)
您可以使用:
awk 'NF==8{m=$1}NF!=8{$0=m$0}1' the.file
但是它会破坏输出格式。
答案 2 :(得分:1)
这适用于固定宽度:
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
答案 3 :(得分:1)
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