簡體   English   中英

從先前的值開始填充,然后刪除

[英]awk to fill from previous value then delete

如果第二列( $2=="")為null,則考慮該行,然后將值打印為$1 ,其余各行打印,直到下一第二列為null ($2=="")為止。 然后需要delete第二列為空的所有行( $2=="")

file.csv

Name_Subject,Marks,Desc,Details
Adam,,,
English,10,xxx,xxx
Maths,20,yyy,yyy
Benn,,,
English,10,xxx,xxx
Maths,20,yyy,yyy
Science,30,zzz,zzz
Zak,,,
English,10,xxx,xxx
Maths,20,yyy,yyy

output.csv

Name,Subject,Marks,Desc,Details
Adam,English,10,xxx,xxx
Adam,Maths,20,yyy,yyy
Benn,English,10,xxx,xxx
Benn,Maths,20,yyy,yyy
Benn,Science,30,zzz,zzz
Zak,English,10,xxx,xxx
Zak,Maths,20,yyy,yyy

我已經嘗試過像下面的命令一樣沒有成功...

awk -F, 'NR==1{print; next} {if($2 == ""){$2=A}} {A=$2} 1' file.csv

編輯#1

實際文件包含,數據之間整行中的某些行為空。 對於此實例,它正在填充空值,但希望捕獲先前的非空值。

file.csv

Name_Subject,Marks,Desc,Details
Adam,,,
English,10,xxx,xxx
Maths,20,yyy,yyy
Benn,,,
English,10,xxx,xxx
Maths,20,yyy,yyy
Science,30,zzz,zzz
,,,
,,,
History,40,zzz,zzz
Zak,,,
English,10,xxx,xxx
Maths,20,yyy,yyy

輸出#1

Name,Subject,Marks,Desc,Details
Adam,English,10,xxx,xxx
Adam,Maths,20,yyy,yyy
Benn,English,10,xxx,xxx
Benn,Maths,20,yyy,yyy
Benn,Science,30,zzz,zzz
,History,40,zzz,zzz
Zak,English,10,xxx,xxx
Zak,Maths,20,yyy,yyy
$ awk '
    BEGIN  { FS=OFS="," }
    NR==1  { split($1,f,/_/); name=f[1]; $1=f[2] }
    $2=="" { name=$1; next }
    { print name, $0 }
' file
Name,Subject,Marks,Desc,Details
Adam,English,10,xxx,xxx
Adam,Maths,20,yyy,yyy
Benn,English,10,xxx,xxx
Benn,Maths,20,yyy,yyy
Benn,Science,30,zzz,zzz
Zak,English,10,xxx,xxx
Zak,Maths,20,yyy,yyy

簡短的awk方法:

awk -F, 'NR==1;$1==""{next}NR>1 && $2==""{ f=$1; next }f{ print f,$0 }' OFS=',' file 

輸出:

Name_Subject,Marks,Desc,Details
Adam,English,10,xxx,xxx
Adam,Maths,20,yyy,yyy
Benn,English,10,xxx,xxx
Benn,Maths,20,yyy,yyy
Benn,Science,30,zzz,zzz
Benn,History,40,zzz,zzz
Zak,English,10,xxx,xxx
Zak,Maths,20,yyy,yyy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM