используйте awk для замены значений нескольких столбцов в зависимости от некоторых условий - PullRequest
2 голосов
/ 04 октября 2019

У меня есть файл csv

D,FNAME,MNAME,LNAME,GENDER,DOB,snapshot,PID.1,PID2,FNAME.1,MNAME.1,LNAME.1,FNAME2,MNAME2,LNAME2
,,,,,,201211.0,2,6,6,J,J,D,,
,,,,,,201211.0,3,4,6,H,H,M,,
,,,,,,201211.0,6,7,8,d,d,d,,
,,,,,,201211.0,0,2,5,6,7,8,,
,,,,,,201211.0,,,,,,,,
,,,,,,201211.0,,,,,,,,

Что я хочу сделать, это использовать информацию в столбцах PID.1, FNAME.1, MNAME.1, LNAME.1 для заполнения столбцов D, FNAME, MNAME, LNAME, если есть нулевое значение, а затем выведите все столбцы в новый CSV-файл. Итак, мой ожидаемый результат -

D,FNAME,MNAME,LNAME,GENDER,DOB,snapshot,PID.1,PID2,FNAME.1,MNAME.1,LNAME.1,FNAME2,MNAME2,LNAME2
2,6,J,J,,,201211.0,2,6,6,J,J,D,,
3,6,H,H,,,201211.0,3,4,6,H,H,M,,
6,8,d,d,,,201211.0,6,7,8,d,d,d,,
0,5,6,7,,,201211.0,0,2,5,6,7,8,,
,,,,,,201211.0,,,,,,,,
,,,,,,201211.0,,,,,,,,

Я пытался использовать awk, чтобы сделать это самостоятельно. Вот мой код.

awk -F, '{if ($1=="" && $8!="")$1=$8;print $0}' test4.csv | awk -F, '{if ($2=="" && $10!="")$2=$10;print $0}' | awk -F, '{if ($3=="" && $11!="")$3=$11;print $0}' | awk -F, '{if ($4=="" && $12!="")$4=$12;print $0}'

Вывод был

D,FNAME,MNAME,LNAME,GENDER,DOB,snapshot,PID.1,PID2,FNAME.1,MNAME.1,LNAME.1,FNAME2,MNAME2,LNAME2
2      201211.0 2 6 6 J J D  
3      201211.0 3 4 6 H H M  
6      201211.0 6 7 8 d d d  
0      201211.0 0 2 5 6 7 8  
,,,,,,201211.0,,,,,,,,
,,,,,,201211.0,,,,,,,,

Так что я этого не сделал. Есть кто-нибудь, кто может мне помочь? Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019
$ awk -F',' -vOFS=',' '($1=="" && $8!=""){$1=$8} ($2=="" && $10!=""){$2=$10} ($3=="" && $11!=""){$3=$11} ($4=="" && $12!=""){$4=$12} {print $0}' test4.csv
D,FNAME,MNAME,LNAME,GENDER,DOB,snapshot,PID.1,PID2,FNAME.1,MNAME.1,LNAME.1,FNAME2,MNAME2,LNAME2
2,6,J,J,,,201211.0,2,6,6,J,J,D,,
3,6,H,H,,,201211.0,3,4,6,H,H,M,,
6,8,d,d,,,201211.0,6,7,8,d,d,d,,
0,5,6,7,,,201211.0,0,2,5,6,7,8,,
,,,,,,201211.0,,,,,,,,
,,,,,,201211.0,,,,,,,,
0 голосов
/ 04 октября 2019

Другой, который стремится быть более общим:

awk '
BEGIN {
    FS=OFS=","                      # set delimiters
}
NR==1 {
    for(i=1;i<=NF;i++)              # store the header names to h hash with indexes
        h[$i]=i
}
NR>1 {                              # copy fields for all but the first record
    $h["D"]=$h["PID.1"]             # referencing with header names
    $h["FNAME"]=$h["FNAME.1"]       # misspelled header name leads to a catastrophy
    $h["MNAME"]=$h["MNAME.1"]       # if you cant spell, use ifs:
    if(h["LNAME"] && h["LNAME.1"])  # but now you have to spell correctly :D
        $h["LNAME"]=$h["LNAME.1"]    
}
1' file                             # output

Вывод:

D,FNAME,MNAME,LNAME,GENDER,DOB,snapshot,PID.1,PID2,FNAME.1,MNAME.1,LNAME.1,FNAME2,MNAME2,LNAME2
2,6,J,J,,,201211.0,2,6,6,J,J,D,,
3,6,H,H,,,201211.0,3,4,6,H,H,M,,
6,8,d,d,,,201211.0,6,7,8,d,d,d,,
0,5,6,7,,,201211.0,0,2,5,6,7,8,,
,,,,,,201211.0,,,,,,,,
,,,,,,201211.0,,,,,,,,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...